遍历数据框列后如何追加列表?

时间:2019-03-29 08:35:51

标签: python python-3.x pandas logic

假设我有一个如下数据框:

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)

2 个答案:

答案 0 :(得分:4)

使用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]

答案 1 :(得分:0)

您可以使用数据框索引编制来刮除所有大于6的所有索引,并使用以下方法创建一组唯一索引:

setA = set(df[df['values'] > 6]['ids'])

这将在数据框中创建一组所有索引:

setB = set(df['ids'])

现在

more = list(setA)

,对于less,采用设定的差值:

less = list(setB.difference(setA))

就是这样!

相关问题