设置行子集的值(索引,布尔设置)

时间:2014-09-12 15:15:36

标签: python pandas

这是后续行动:

What is correct syntax to swap column values for selected rows in a pandas data frame using just one line?

不会给出解决方法的信用,仅用于解释。作为原始问题的答案,已经提供了三种解决方法。

下面有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

1 个答案:

答案 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

这个只是将结果广播到左侧。这就是数字被传播的原因。

底线。熊猫试图找出任务中的右手边。他们的案子很多。