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

时间:2020-04-11 19:01:24

标签: python pandas dataframe

我有一个名为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。

1 个答案:

答案 0 :(得分: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()