Pandas中多列的条件赋值

mgdq6dx1  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(231)

使用Pandas1.42
拥有一个包含5列的DataFrame:A、B、C、D、E
如果C列的值为真,我需要将D列和E列的值赋给A列和B列,我希望使用.loc方法在一行中完成此操作。

示例

| A类|B|C级|D级|E级|
| - ------|- ------|- ------|- ------|- ------|
| 1个|四个|真的|七|十个|
| 第二章|五个|假|八个|十一|
| 三个|六个|真的|九|十二|

预期结果

| A类|B|C级|D级|E级|
| - ------|- ------|- ------|- ------|- ------|
| 七|十个|真的|七|十个|
| 第二章|五个|假|八个|十一|
| 九|十二|真的|九|十二|

df = pd.DataFrame(
  {'A': [1, 2, 3], 
  'B': [4, 5, 6], 
  'C': [True, False, True], 
  'D': [7, 8, 9], 
  'E': [10, 11, 12]}
)

df.loc[df['C'], ['A', 'B']] = df[['D', 'E']]
实际结果

| A类|B|C级|D级|E级|
| - ------|- ------|- ------|- ------|- ------|
| 楠|楠|真的|七|十个|
| 第二章|五个|假|八个|十一|
| 楠|楠|真的|九|十二|

解决方案我想
df.loc[df['C'], ['A', 'B']] = (df.D[df.C], df.E[df.C])

看起来如果Pandas是以DataFrame的形式出现的话,它们就不能正确地被赋值,但是如果你把它很好地打包成Series的元组,它就能正确地赋值。我是语法错误还是Pandas中的一个bug?

jqjz2hbq

jqjz2hbq1#

在两端使用布尔索引,并通过转换to_numpy数组来删除索引对齐:

m = df['C']
df.loc[m, ['A', 'B']] = df.loc[m, ['D', 'E']].to_numpy()

或者使用set_axis更改列名:

df.loc[df['C'], ['A', 'B']] = df[['D', 'E']].set_axis(['A', 'B'], axis=1)

输出:

A   B      C  D   E
0  7  10   True  7  10
1  2   5  False  8  11
2  9  12   True  9  12

相关问题