如何迭代数据框列中的列表项
Posted
技术标签:
【中文标题】如何迭代数据框列中的列表项【英文标题】:how to iterate items of list in columns of dataframe 【发布时间】:2019-07-05 21:25:20 【问题描述】:这是我的数据框:
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] )
我必须在列的每一行中迭代列表吗? 我相信 pandas 的优势之一是广播,但我不确定这里是否可能......
【问题讨论】:
【参考方案1】:用途:
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
by DataFrame.isin
的过滤列:
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 数组,按位 OR 链接并最后转换为整数:
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)
【讨论】:
【参考方案2】:使用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
【讨论】:
以上是关于如何迭代数据框列中的列表项的主要内容,如果未能解决你的问题,请参考以下文章
如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?