仅使用一行交换 pandas 数据框中选定行的列值的正确语法是什么?

新手上路,请多包涵

我在 Python 2.7.5 中使用 pandas 版本 0.14.1,我有一个包含三列的数据框,例如:

 import pandas as pd

d = {'L':  ['left', 'right', 'left', 'right', 'left', 'right'],
     'R': ['right', 'left', 'right', 'left', 'right', 'left'],
     'VALUE': [-1, 1, -1, 1, -1, 1]}
df = pd.DataFrame(d)

idx = (df['VALUE'] == 1)

生成如下所示的数据框:

        L      R  VALUE
0   left  right     -1
1  right   left      1
2   left  right     -1
3  right   left      1
4   left  right     -1
5  right   left      1

对于 VALUE == 1 的行,我想交换左右列的内容,以便所有“左”值都将在“L”列下结束,而“右”值最终在“R”列下。

已经在上面定义了 idx 变量,我可以通过使用如下临时变量轻松地在另外三行中完成此操作:

 tmp = df.loc[idx,'L']
df.loc[idx,'L'] = df.loc[idx,'R']
df.loc[idx,'R'] = tmp

然而,这对我来说似乎是非常笨拙和不优雅的语法; pandas 肯定支持更简洁的东西吗?我注意到,如果我将输入中的列顺序交换到数据框 .loc 属性,那么我会得到以下交换输出:

 In [2]: print(df.loc[idx,['R','L']])
      R      L
1  left  right
3  left  right
5  left  right

这向我表明,我应该能够通过仅使用以下单行来实现与上面相同的交换:

 df.loc[idx,['L','R']] = df.loc[idx,['R','L']]

但是,当我实际尝试这样做时,什么也没有发生——列保持不变。就好像 pandas 自动识别出我在赋值语句右侧的列顺序错误,它会自动纠正问题。有没有一种方法可以在 pandas 赋值语句中禁用此“列顺序自动更正”,以便在不创建不必要的临时变量的情况下实现交换?

原文由 stachyra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 415
2 个回答

避免列名对齐的一种方法是通过 .values 下拉到底层数组:

 In [33]: df
Out[33]:
       L      R  VALUE
0   left  right     -1
1  right   left      1
2   left  right     -1
3  right   left      1
4   left  right     -1
5  right   left      1

In [34]: df.loc[idx,['L','R']] = df.loc[idx,['R','L']].values

In [35]: df
Out[35]:
      L      R  VALUE
0  left  right     -1
1  left  right      1
2  left  right     -1
3  left  right      1
4  left  right     -1
5  left  right      1

原文由 DSM 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里要注意的关键是 pandas 尝试使用索引和列名自动对齐行和列。因此,您需要以某种方式告诉 pandas 忽略此处的列名。一种方法是像@DSM 那样,通过转换为 numpy 数组。另一种方法是重命名列:

 >>> df.loc[idx] = df.loc[idx].rename(columns={'R':'L','L':'R'})

      L      R  VALUE
0  left  right     -1
1  left  right      1
2  left  right     -1
3  left  right      1
4  left  right     -1
5  left  right      1

原文由 JohnE 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题