循环遍历数据框列后如何附加列表?
Posted
技术标签:
【中文标题】循环遍历数据框列后如何附加列表?【英文标题】:How to append a list after looping over a dataframe column? 【发布时间】:2019-08-20 03:41:43 【问题描述】:假设我有如下数据框:
df = pd.DataFrame( 'ids' : ['1', '1', '1', '1', '2', '2', '2', '3', '3'],
'values' : ['5', '8', '7', '12', '2', '1', '3', '15', '4']
, dtype='int32')
ids values
1 5
1 7
1 8
1 12
2 1
2 3
2 2
3 4
3 15
我想做的是遍历values
列并检查哪些值大于6,并且ids
列中的相应id 必须附加到一个空列表中。
即使一个 id(比如 3)有多个值,并且在这些多个值(4 和 15)中,只有一个值大于 6,我希望将相应的 id 附加到列表中。
示例: 假设我们在上述数据帧 df 上运行一个循环,我希望输出如下:
more = [1, 3]
less = [2]
more =[]
和 less = []
是预初始化的空列表
我目前所拥有的: 我尝试实施相同的方法,但肯定我做错了。我的代码:
less = []
more = []
for value in df['values']:
for id in df['ids']:
if (value > 6):
more.append(id)
else:
less.append(id)
【问题讨论】:
id 2 的值也大于 6 @anky_91 编辑了问题:) 我现在更改了数据框。 2 现在的所有值都小于 6 你从你的代码中得到了什么输出? 【参考方案1】:使用groupby
和布尔索引来创建您的列表。这将比循环快得多:
g = df.groupby('ids')['values'].max()
mask = g.gt(6)
more = g[mask].index.tolist()
less = g[~mask].index.tolist()
print(more)
print(less)
[1, 3]
[2]
【讨论】:
工作就像一个魅力。谢谢! @KashyapMaheshwari 很高兴它有帮助:)【参考方案2】:您可以使用数据帧索引来清除所有大于 6 的索引,并使用以下方法创建一组唯一索引:
setA = set(df[df['values'] > 6]['ids'])
这将在数据框中创建一组所有索引:
setB = set(df['ids'])
现在,
more = list(setA)
对于less
,取集合差:
less = list(setB.difference(setA))
就是这样!
【讨论】:
以上是关于循环遍历数据框列后如何附加列表?的主要内容,如果未能解决你的问题,请参考以下文章