请承担序言。首先解决一些更高层次的概念很重要。由于我的动机是分享知识和授课,所以我想使这一点尽可能清晰。
它有利于建立一个什么样的心理模型
Series和
Dataframe对象。
解剖 Series
Series应该将A视为增强型词典。这并不总是一个完美的类比,但是我们将从这里开始。另外,您还可以进行其他类比,但我将目标放在字典上,以证明本文的目的。
index
这些是我们可以参考以获取相应值的键。当索引的元素是唯一的时,与字典的比较变得非常接近。
values
这些是由索引键入的相应值。
解剖 Dataframe
一个
Dataframe应该被看作是一个字典
Series或
Series的
Series。在这种情况下,键是列名称,值是列本身作为
Series对象。每个人都
Series同意分享相同的内容
index,这是的索引
Dataframe。
columns
这些是我们可以参考以获取相应键的键
Series。
index
这是所有
Series值均同意共享的索引。
注意:RE:columns
和index
对象
它们是同一种东西。甲
Dataframe小号
index可以用作另一
Dataframe小号
columns。实际上,当您进行
df.T移调时会发生这种情况。
values
这是一个二维数组,其中包含数据
Dataframe。现实情况是,
values是 不是
有什么存储在里面
Dataframe的对象。(有时候是这样,但是我不想描述块管理器)。关键是,最好将其视为对数据二维数组的访问。
定义样本数据
这些样本
pandas.Index可以被用作对象
index的一个
Series或
Dataframe或可以用作所述
columns的一
Dataframe
idx_lower = pd.Index([*'abcde'], name='lower')idx_range = pd.RangeIndex(5, name='range')
这些是
pandas.Series使用上述
pandas.Index对象的示例对象
s0 = pd.Series(range(10, 15), idx_lower)s1 = pd.Series(range(30, 40, 2), idx_lower)s2 = pd.Series(range(50, 10, -8), idx_range)
这些是
pandas.Dataframe使用上述
pandas.Index对象的示例对象
df0 = pd.Dataframe(100, index=idx_range, columns=idx_lower)df1 = pd.Dataframe( np.arange(np.product(df0.shape)).reshape(df0.shape), index=idx_range, columns=idx_lower)
Series
上 Series
当在两个上操作时
Series,对齐是显而易见的。您将
index其中一个
Series与
index另一个对齐。
s1 + s0lowera 40b 43c 46d 49e 52dtype: int64
这与我在操作前随机洗牌时的情况相同。索引仍将对齐。
s1 + s0.sample(frac=1)lowera 40b 43c 46d 49e 52dtype: int64
而且是 不是
时候,而不是我与洗牌的值进行操作的情况
Series。在这种情况下,Pandas不需要
index与之对齐,因此只能从某个位置操作。
s1 + s0.sample(frac=1).valueslowera 42b 42c 47d 50e 49dtype: int64
添加标量
s1 + 1lowera 31b 33c 35d 37e 39dtype: int64
Dataframe
上 Dataframe
在两个
Dataframes之间进行操作时,类似情况也是如此
。对齐是显而易见的,并且执行了我们认为应该做的事情
df0 + df1lower a b c d erange 0 100 101 102 103 1041 105 106 107 108 1092 110 111 112 113 1143 115 116 117 118 1194 120 121 122 123 124
Dataframe在两个轴上随机播放秒。在
index和
columns仍然对齐,给我们同样的事情。
df0 + df1.sample(frac=1).sample(frac=1, axis=1)lower a b c d erange 0 100 101 102 103 1041 105 106 107 108 1092 110 111 112 113 1143 115 116 117 118 1194 120 121 122 123 124
同样的改组,但添加数组而不是
Dataframe。不再对齐,将获得不同的结果。
df0 + df1.sample(frac=1).sample(frac=1, axis=1).valueslower a b c d erange 0 123 124 121 122 1201 118 119 116 117 1152 108 109 106 107 1053 103 104 101 102 1004 113 114 111 112 110
添加一维数组。将与列对齐并跨行广播。
df0 + [*range(2, df0.shape[1] + 2)]lower a b c d erange 0 102 103 104 105 1061 102 103 104 105 1062 102 103 104 105 1063 102 103 104 105 1064 102 103 104 105 106
添加标量。没有什么可以与所有广播内容保持一致的
df0 + 1lower a b c d erange 0 101 101 101 101 1011 101 101 101 101 1012 101 101 101 101 1013 101 101 101 101 1014 101 101 101 101 101
Dataframe
上 Series
如果将
Dataframes视为值的字典,
Series并将s
Series视为值的字典,那么很自然的是,在a
Dataframe和之间进行操作时
Series,应按“键”对齐它们。
s0:lower a b c d e 10 11 12 13 14df0:lower a b c d erange 0 100 100 100 100 1001 100 100 100 100 1002 100 100 100 100 1003 100 100 100 100 1004 100 100 100 100 100
当我们进行操作时,
10in
s0['a']被添加到
df0['a']
df0 + s0lower a b c d erange 0 110 111 112 113 1141 110 111 112 113 1142 110 111 112 113 1143 110 111 112 113 1144 110 111 112 113 114
问题的核心和帖子的重点
如果我要
s2和
df0怎么办?
s2: df0: | lower a b c d erange | range 0 50 | 0 100 100 100 100 1001 42 | 1 100 100 100 100 1002 34 | 2 100 100 100 100 1003 26 | 3 100 100 100 100 1004 18 | 4 100 100 100 100 100
当我手术时,我得到
np.nan了问题中所引用的一切
df0 + s2 a b c d e 0 1 2 3 4range 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
这不会产生我们想要的。因为Pandas正在将
indexof
s2与
columnsof对齐
df0。该
columns结果包含的工会
index的
s2及
columns的
df0。
我们可以通过棘手的换位来伪造它
(df0.T + s2).Tlower a b c d erange 0 150 150 150 150 1501 142 142 142 142 1422 134 134 134 134 1343 126 126 126 126 1264 118 118 118 118 118
但是事实证明,熊猫有更好的解决方案。有一些操作方法可让我们传递
axis参数以指定要对齐的轴。
-
sub
+
add
*
mul
/
div
**
pow
所以答案很简单
df0.add(s2, axis='index')lower a b c d erange 0 150 150 150 150 1501 142 142 142 142 1422 134 134 134 134 1343 126 126 126 126 1264 118 118 118 118 118
原来
axis='index'是的同义词
axis=0。
由于是
axis='columns'同义
axis=1
df0.add(s2, axis=0)lower a b c d erange 0 150 150 150 150 1501 142 142 142 142 1422 134 134 134 134 1343 126 126 126 126 1264 118 118 118 118 118
其余操作
df0.sub(s2, axis=0)lower a b c d erange 0 50 50 50 50 501 58 58 58 58 582 66 66 66 66 663 74 74 74 74 744 82 82 82 82 82
df0.mul(s2, axis=0)lower a b c d erange 0 5000 5000 5000 5000 50001 4200 4200 4200 4200 42002 3400 3400 3400 3400 34003 2600 2600 2600 2600 26004 1800 1800 1800 1800 1800
df0.div(s2, axis=0)lower a b c d erange 0 2.000000 2.000000 2.000000 2.000000 2.0000001 2.380952 2.380952 2.380952 2.380952 2.3809522 2.941176 2.941176 2.941176 2.941176 2.9411763 3.846154 3.846154 3.846154 3.846154 3.8461544 5.555556 5.555556 5.555556 5.555556 5.555556
df0.pow(1 / s2, axis=0)lower a b c d erange 0 1.096478 1.096478 1.096478 1.096478 1.0964781 1.115884 1.115884 1.115884 1.115884 1.1158842 1.145048 1.145048 1.145048 1.145048 1.1450483 1.193777 1.193777 1.193777 1.193777 1.1937774 1.291550 1.291550 1.291550 1.291550 1.291550



