我有一个名为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。
答案 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()