【问题标题】: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
  • 你从你的代码中得到了什么输出?

标签: python python-3.x pandas logic


【解决方案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))

就是这样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2021-08-31
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多