循环遍历数据框列后如何附加列表?

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))

就是这样!

【讨论】:

以上是关于循环遍历数据框列后如何附加列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框列中附加值

KeyError:重命名数据框列后为 1.0

如何有条件地转换熊猫数据框列

如何迭代数据列的每个单元格,转换和附加每个单元格?

迭代循环并将列表添加到新行或新列中的数据框

Python:如何循环列表并附加到新列表