如何在pandas中有条件地交换列

2024-04-26 12:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧df,有4列。例如,这里有一个玩具的例子:

foo1    foo2     foo3  foo4
egg     cheese   2     1
apple   pear     1     3
french  spanish  10    1

列是foo1、foo2、foo3和foo4

我想交换foo1列和foo2列,也可以在foo3<;foo4时交换foo3和foo4列。所以结果是:

^{pr2}$

我可以找到需要与df[df['foo3'] < df['foo4']]交换的行,但是如何才能有效地进行交换呢。我的数据帧很大。在


Tags: 数据applepandasdfegg例子pear玩具
2条回答

您可以使用pandas.Series.where函数根据以下条件构造新的数据帧:

pairs = [('foo1', 'foo2'), ('foo3', 'foo4')]  # construct pairs of columns that need to swapped

df_out = pd.DataFrame() 

# for each pair, swap the values if foo3 < foo4
for l, r in pairs:
    df_out[l] = df[l].where(df.foo3 < df.foo4, df[r])
    df_out[r] = df[r].where(df.foo3 < df.foo4, df[l])

df_out
#     foo1   foo2   foo3  foo4
#0  cheese    egg      1     2
#1   apple   pear      1     3
#2 spanish french      1    10

可以找到带有df[df['foo3'] < df['foo4']]的行,但是如果改用布尔级数,则可以轻松实现目标:

s = df['foo3'] < df['foo4']
df.loc[s, ['foo1','foo2']] = df.loc[s, ['foo2','foo1']].values
df.loc[s, ['foo3','foo4']] = df.loc[s, ['foo4','foo3']].values

注意,您需要在RHS的末尾使用.values,以防止Pandas在列名上对齐,这将破坏其用途。在

相关问题 更多 >