我如何基于多列中的值过滤Pandas DataFrame?

问题描述 投票:0回答:1

我有一个名为df的DataFrame,具有40,000行和90+列。

这是它的摘要:

p1 p2 p3 p4 value 
0  1  0  1   5
1  0  1  0   4
1  1  0  0   6
0  1  0  1   2

我希望能够找到p1,p2,p3,p4的唯一组合的“值”之和。因此,当p2 = 1和p4 = 1(每组p1,p2,p3,p4中始终总是有两个1)时,“值”列的总和在这种情况下将为7。使用df[(df.p2 == 1) & (df.p4 == 1)].value.sum()可以轻松找到。

但是,我不知道如何为my DataFrame df执行此操作,因为它太大了。它由p1-p89代替,而不是p1-p4。

我最初的想法是使用我要过滤的89列的值创建一个新列:

unique_list = []
for n in range(0,df.shape[0]):
    unique_list.append(str(df.values[n][1:90]))
df['identifier'] = unique_list

每行将具有这89个值的标识符,因此我可以根据该行进行排序。但是,这花费了相当长的时间。我估计此for循环大约需要40分钟才能完成。持续的时间并不长-到我完成提交这个问题的时间时,它可能即将完成。但是为了学习,我忍不住想必须要有一种更有效的方法来实现这一目标。

所以,在那儿吗?有没有一种方法可以让我无需创建新的标识符列?

[如果有关系,我的最终目标是创建一个新的DataFrame,其中行数是p1-p89的唯一组合数。新DataFrame中的“值”列将是前一个DataFrame中该组合的所有实例的“值”列的总和,并且每个唯一组合将有一个新的“值”列的总和的p1-p89。

python pandas dataframe
1个回答
2
投票

似乎您可以使用groupby来做到这一点。

# Get everything except the value column.
group_cols = [o for o in df.columns if o != 'value']

# Group into unique combinations, sum the value column.
unique_counts = df.groupby(group_cols).sum().reset_index()
© www.soinside.com 2019 - 2024. All rights reserved.