如何在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。所以结果是:>

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

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

你可以找到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对齐列名,这将破坏目的。

您可以使用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

最新更新