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

2024-03-14

我在用pandas http://pandas.pydata.org/版本 0.14.1 和 Python 2.7.5,我有一个包含三列的数据框,例如:

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 赋值语句中禁用此“列顺序自动更正”,以便在不创建不必要的临时变量的情况下实现交换?


避免列名对齐的一种方法是通过下拉到底层数组.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐