假设我有一个如下数据框:
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)
答案 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))
就是这样!