复制 pandas 中的列

问题描述 投票:0回答:1

我想比较两列或多列,并将较大和较小的值放在新列中。

首先我复制了两列,然后更改了符合条件的行的值。

但是存在一个问题,就是不满足条件的行值改为nan。

  1. 如何不改成nan
  2. 如何一次完成所有这些(如果可能)

样品:

import pandas as pd

a = [
    {'a': 5, 'b': 10, 'c': 5},
    {'a': 4, 'b': 0.5, 'c': 1},
    {'a': 3.5, 'b': 15, 'c': 9},
    {'a': 2.1, 'b': 5, 'c': 8},
    {'a': 0.1, 'b': 1, 'c': 5},
]

df = pd.DataFrame(a)
df.loc[:, ['Big', 'Small']] = df[['a', 'b']].values
print(df.head())
df.loc[df['a'] < df['b'], ['Big', 'Small']] = df[['b', 'a']]
print(df.head())
>>
     a     b  c  Big  Small
0  5.0  10.0  5  5.0   10.0
1  4.0   0.5  1  4.0    0.5
2  3.5  15.0  9  3.5   15.0
3  2.1   5.0  8  2.1    5.0
4  0.1   1.0  5  0.1    1.0

     a     b  c  Big  Small
0  5.0  10.0  5  NaN    NaN
1  4.0   0.5  1  4.0    0.5
2  3.5  15.0  9  NaN    NaN
3  2.1   5.0  8  NaN    NaN
4  0.1   1.0  5  NaN    NaN

我想要:

>>
      a     b  c  Big  Small
*0  5.0  10.0  5 10.0    5.0*
 1  4.0   0.5  1  4.0    0.5
*2  3.5  15.0  9 15.0    3.5*
*3  2.1   5.0  8  5.0    2.1*
*4  0.1   1.0  5  1.0    0.1*
pandas
1个回答
0
投票

您应该在两侧使用掩码并转换为数组以避免列对齐:

m = df['a'] < df['b']
df.loc[m, ['Big', 'Small']] = df.loc[m, ['b', 'a']].values

输出:

     a     b  c   Big  Small
0  5.0  10.0  5  10.0    5.0
1  4.0   0.5  1   4.0    0.5
2  3.5  15.0  9  15.0    3.5
3  2.1   5.0  8   5.0    2.1
4  0.1   1.0  5   1.0    0.1
© www.soinside.com 2019 - 2024. All rights reserved.