我需要在熊猫数据框中创建一列,该列依赖于同一行中的其他项目。例如,这是我的数据框。
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]
如何使用熊猫apply
或map
来做到这一点?我首先想到的是遍历行,但这似乎是一种笨拙的方式。
答案 0 :(得分:2)
您可以将apply
与axis=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)