这是我的数据框:
import pandas as pd
df = pd.DataFrame({'animal':['dog','cat','rabbit','pig'],'color':['red','green','blue','purple'],\
'season':['spring,','summer','fall','winter']})
我有一个列表
l = ['dog','green','purple']
使用这些数据框和列表,我想在df中添加另一列,这实际上是如果“动物”列或“颜色”列与l(list)的某些项匹配的结果。
所以,我想要的结果(数据框)在下面(我想表示一个表):
pd.DataFrame({'animal':['dog','cat','rabbit','pig'],
'color':['red','green','blue','purple'],
'season':['spring,','summer','fall','winter'],
'tar_rm':[1,1,0,1] })
我是否必须迭代列的每一行中的列表? 我相信大熊猫的优势之一就是广播,但我不确定这是否有可能...
答案 0 :(得分:3)
使用:
cols = ['animal','color']
df['tar_rm'] = df[cols].isin(l).any(axis=1).astype(int)
print (df)
animal color season tar_rm
0 dog red spring 1
1 cat green summer 1
2 rabbit blue fall 0
3 pig purple winter 1
详细信息:
首先比较DataFrame.isin
对DataFrame
的过滤列:
print (df[cols].isin(l))
animal color
0 True False
1 False True
2 False False
3 False True
然后通过DataFrame.any
测试每行是否至少有True
:
print (df[cols].isin(l).any(axis=1))
0 True
1 True
2 False
3 True
dtype: bool
最后一个布尔值转换为整数:
print (df[cols].isin(l).any(axis=1).astype(int))
0 1
1 1
2 0
3 1
dtype: int32
如果性能很重要,请分别isin
比较每一列,将其转换为numpy数组,按位或进行链接,最后转换为整数:
df['tar_rm'] = (df['animal'].isin(l).values | df['color'].isin(l).values).astype(int)
性能:取决于丝束数量,匹配的行数和列表值的数量,因此最好在真实数据中进行测试:
l = ['dog','green','purple']
df = pd.concat([df] * 100000, ignore_index=True).sample(1)
In [173]: %timeit df['tar_rm'] = df[['animal','color']].isin(l).any(axis=1).astype(int)
2.11 ms ± 250 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [174]: %timeit df['tar_rm'] = (df['animal'].isin(l).values | df['color'].isin(l).values).astype(int)
487 µs ± 9.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [175]: %timeit df['tar_rm'] = np.where(df['animal'].isin(l) | df['color'].isin(l), 1, 0)
805 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
答案 1 :(得分:1)
使用numpy
df['tar_rm'] = np.where(df['animal'].isin(l) | df['color'].isin(l), 1, 0)
输出
animal color season tar_rm
0 dog red spring, 1
1 cat green summer 1
2 rabbit blue fall 0
3 pig purple winter 1