这是后续行动:
不会给出解决方法的信用,仅用于解释。作为原始问题的答案,已经提供了三种解决方法。
下面有3个设置值的示例。你怎么解释不同的结果?为什么#1和#2以不同方式失败,而#3工作正常?这种行为是否有问题,或者事实应该如何运作?
df = DataFrame({'L': ['left', 'right', 'left', 'right'],
'R': ['right', 'left', 'right', 'left'],
'idx': [False, True, False, True],
'num': np.arange(4) })
df1 = df.copy()
df2 = df.copy()
df3 = df.copy()
#1 nothing happens
df1.loc[df1.idx,['L','R']] = df1.loc[df1.idx,['R','L']]
#2 weird results
df2.loc[df2.idx,['L','R']] = df2[['R','L']]
#3 similar to #2, works fine
df3.loc[df3.idx,['L','R']] = df3['num']
之前和之后的数据:
df
L R idx num
0 left right False 0
1 right left True 1
2 left right False 2
3 right left True 3
df1
L R idx num
0 left right False 0
1 right left True 1
2 left right False 2
3 right left True 3
df2
L R idx num
0 left right False 0
1 left right True 1
2 left right False 2
3 right left True 3
df3
L R idx num
0 left right False 0
1 1 1 True 1
2 left right False 2
3 3 3 True 3
答案 0 :(得分:2)
Pandas 对齐设置操作的右侧。然后取左侧面具并将它们设置为相等。
所以这是左手索引器。因此,您将使rhs具有相同的形状(或可以播放)。
In [61]: df1.loc[df1.idx,['L','R']]
Out[61]:
L R
1 right left
3 right left
这是第一个。我只会展示右手对齐(y)。
In [49]: x, y = df1.align(df1.loc[df1.idx,['L','R']])
In [51]: y
Out[51]:
L R idx num
0 NaN NaN NaN NaN
1 right left NaN NaN
2 NaN NaN NaN NaN
3 right left NaN NaN
因此,即使您在右侧的输入中反转了列,对齐也会将它们按顺序排列。所以你设置相同的值,因此没有变化。
In [63]: x, y = df2.align(df2[['R','L']])
In [65]: y
Out[65]:
L R idx num
0 left right NaN NaN
1 right left NaN NaN
2 left right NaN NaN
3 right left NaN NaN
注意与上述不同。这仍然是一个完整的帧(而不是子选择,因此右侧的形状现在!=左侧的形状,与上面的例子相反)。
在这一点上,他们是重新索引的步骤。 可能是一个错误,因为我认为这应该与您的第一个示例相同。请为此提交错误报告(例如,使用df1和df2的示例)。它们应该在分配后出现== df。
In [58]: x, y = df1.align(df3['num'],axis=0)
In [60]: y
Out[60]:
0 0
1 1
2 2
3 3
Name: num, dtype: int64
这个只是将结果广播到左侧。这就是数字被传播的原因。
底线。熊猫试图找出任务中的右手边。他们的案子很多。