【发布时间】:2017-12-31 11:15:47
【问题描述】:
我在 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
然而,这对我来说似乎是非常笨拙和不雅的语法;熊猫肯定支持更简洁的东西吗?我注意到,如果我将输入中的列顺序交换到数据框.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 赋值语句中禁用这种“列顺序自动更正”,以便在不创建不必要的临时变量的情况下实现交换?
【问题讨论】:
-
你看过dataframe.eval吗?他们在熊猫文档中有示例: >>> df = DataFrame(randn(10, 2), columns=list('ab')) >>> df.eval('a + b') >>> df.eval( 'c = a + b')
-
对于任何好奇的人,我已经发布了一个后续问题:stackoverflow.com/questions/25811529/…