如何根据许多列中的值过滤 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()。


但是,我不知道如何为我的DataFrame df 执行此操作,因为它有多大。它不是 p1-p4,而是由 p1-p89 组成。


我最初的想法是创建一个新列,其中包含我要过滤的 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 中的 'value' 列将是前一个 DataFrame 中该组合的所有实例的 'value' 列的总和,并且每个唯一组合都会有一个新的 find 'value' 列的总和p1-p89。


慕哥6287543
浏览 98回答 1
1回答

跃然一笑

似乎您可以使用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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python