如果其他条件在多个列上,则为熊猫

时间:2019-08-08 09:22:08

标签: python pandas

假设我的df以下:

import pandas as pd

data_dic = {
    "a": [0,0,1,2],
    "b": [0,3,4,5],
    "c": [6,7,8,9]
}
df = pd.DataFrame(data_dic)

结果:

   a  b  c
0  0  0  6
1  0  3  7
2  1  4  8
3  2  5  9

我需要根据条件将值从上述列中粘贴到新列中

if df.a > 0 then value df.a
else if df.b > 0 then value df.b 
else value df.c

我现在尝试:

df['value'] = [x if x > 0 else 'ww' for x in df['a']]

但是不知道如何在其中输入更多条件。

预期结果:

   a  b  c value
0  0  0  6  6
1  0  3  7  3
2  1  4  8  1
3  2  5  9  2

感谢您的辛勤工作。

3 个答案:

答案 0 :(得分:4)

您还可以使用列表理解:

df['value'] = [x if x > 0 else y if y>0 else z for x,y,z in zip(df['a'],df['b'],df['c'])]

答案 1 :(得分:3)

使用numpy.select

df['value'] = np.select([df.a > 0 , df.b > 0], [df.a, df.b], default=df.c)
print (df)
   a  b  c  value
0  0  0  6      6
1  0  3  7      3
2  1  4  8      1
3  2  5  9      2

在40万行中向量化和循环解之间的区别:

df = pd.concat([df] * 100000, ignore_index=True)

In [158]: %timeit df['value2'] = np.select([df.a > 0 , df.b > 0], [df.a, df.b], default=df.c)
9.86 ms ± 611 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [159]: %timeit df['value1'] = [x if x > 0 else y if y>0 else z for x,y,z in zip(df['a'],df['b'],df['c'])]
399 ms ± 52.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

答案 2 :(得分:1)

您可以编写一个函数,该函数将一行作为参数,测试要测试的任何条件,然后返回TrueFalse结果-然后可以将其用作选择工具。 (尽管重新阅读了您的问题,但这可能不是您想要的-请参阅下面的第2部分)

执行选择

apply将此函数应用于您的数据框,并使用返回的一系列True / False答案作为索引从实际数据框本身中选择值。

例如

def selector(row):
    if row['a'] > 0 and row['b'] == 3 :
        return True
    elif row['c'] > 2:
        return True
    else:
        return False

您可以构建自己喜欢的任何逻辑,只需确保在需要匹配时返回True,否则就返回False。

然后尝试类似

df.apply(lambda row : selector(row), axis=1)

它将返回一系列对错答案。将其插入到df中,以仅选择已为其计算出True值的那些行。

df[df.apply(lambda row : selector(row), axis=1)]

这应该给您您想要的。

第2部分-执行计算

如果要创建一个包含一些计算结果的新列-这是一个类似的操作,请创建一个执行计算的函数:

def mycalc(row):
    if row['a'] > 5 :
        return row['a'] + row['b']
    else:
        return 66

仅这次,apply结果并将其分配给新的列名:

df['value'] = df.apply( lambda row : mycalc(row), axis = 1)

这将为您带来结果。