应用多个Pandas列的功能?

时间:2018-11-26 20:09:34

标签: python pandas

我需要在熊猫数据框中创建一列,该列依赖于同一行中的其他项目。例如,这是我的数据框。

df = pd.DataFrame(
    [['a',],['a',1],['a',1],['a',2],['b',2],['b',2],['c',3]],
    columns=['letter','number']
)


    letters     numbers
0   a   1
1   a   1
2   a   1
3   a   2
4   b   2
5   b   2
6   c   3

我需要第三列,如果行中有'a'和2,则为1,否则为0。原来是[0,0,0,1,0,0,0]

如何使用熊猫applymap来做到这一点?我首先想到的是遍历行,但这似乎是一种笨拙的方式。

2 个答案:

答案 0 :(得分:2)

您可以将applyaxis=1一起使用。假设您想调用新列c

df['c'] = df.apply(
    lambda row: (row['letter'] == 'a') and (row['number'] == 2),
    axis=1
).astype(int)

print(df)
#  letter  number  c
#0      a     NaN  0
#1      a     1.0  0
#2      a     1.0  0
#3      a     2.0  1
#4      b     2.0  0
#5      b     2.0  0
#6      c     3.0  0

但是apply很慢,应尽可能避免。在这种情况下,最好对向量进行布尔化的逻辑运算。

df['c'] = ((df['letter'] == "a") & (df['number'] == 2)).astype(int)

与上面的apply使用相同的结果。

答案 1 :(得分:1)

您可以尝试使用pd.Series.where()/ np.where()。如果您仅对布尔值的int表示感兴趣,则可以选择其他解决方案。如果您想要更大的if / else值自由度,可以使用np.where()

import pandas as pd
import numpy as np

# create example
values = ['a', 'b', 'c']
df = pd.DataFrame()
df['letter'] = np.random.choice(values, size=10)
df['number'] = np.random.randint(1,3, size=10)

# condition
df['result'] = np.where((df['letter'] == 'a') & (df['number'] == 2), 1, 0)