【问题标题】:How to sum a column over unique values in two other column with Pandas?如何用 Pandas 对另外两列中的唯一值求和?
【发布时间】:2019-12-11 09:48:43
【问题描述】:

在给定数据框中其他两列的唯一值的情况下,我需要找到一列的总和。

模拟我正在尝试做的示例代码。

import numpy as np
import pandas as pd
def makeDictArray(**kwargs):
    data = {}
    size = kwargs.get('size',20)
    strings = 'What is this sentence about? And why do you care?'.split(' ')
    bools = [True,False]
    bytestrings = list(map(lambda x:bytes(x,encoding='utf-8'),strings))
    data['ByteString'] = np.random.choice(bytestrings, size)
    data['Unicode'] = np.random.choice(strings, size)
    data['Integer'] = np.random.randint(0,500,size)
    data['Float'] = np.random.random(size)
    data['Bool'] = np.random.choice(bools,size)
    data['Time'] = np.random.randint(0,1500,size)

    return data

def makeDF(**kwargs):
    size = kwargs.get('size',20)
    data = makeDictArray(size=size)
    return pd.DataFrame(data)

x = makeDF(size=1000000)
x['SUM'] = 0.
xx = x.groupby(['Time','Integer'])['Float'].agg('sum')

这里是xx:

Time  Integer
0     0          0.826326
      1          4.897836
      2          5.238863
      3          6.694214
      4          6.791922

1499  495        5.621809
      496        7.385356
      497        4.755907
      498        6.470006
      499        3.634070
Name: Float, Length: 749742, dtype: float64

我尝试过的:

uniqueTimes = pd.unique(x['Time'])
for t in uniqueTimes:
    for i in xx[t].index:
        idx = (x['Time'] == t) & (x['Integer'] == i)
        if idx.any():
            x.loc[idx,'SUM'] = xx[t][i]

这给了我正确的结果,但我想将总和的值放回新创建的“SUM”列中的“x”中。我可以通过执行双重 for 循环来实现这一点,但是,这很慢而且似乎不是“熊猫方式”。

大家有什么建议吗?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    如果我正确理解了问题,您希望在["Time", "Integer"] 上对xxx 进行标准合并。

    x = makeDF(size=5)
    xx = x.groupby(['Time','Integer'])['Float'].agg('sum')
    
    pd.merge(x, xx.to_frame(name="SUM"), on=["Time", "Integer"])
    

    输出

      ByteString Unicode  Integer     Float   Bool  Time       SUM
    0  b'about?'    this      209  0.116809  False  1418  0.116809
    1     b'why'      is       12  0.043745   True  1159  0.043745
    2   b'care?'   care?      493  0.479680  False   487  0.479680
    3  b'about?'  about?      102  0.503759  False   335  0.503759
    4     b'And'   care?      197  0.394406  False   207  0.394406
    

    【讨论】:

    • 哇,是的。而已。不敢相信我太盲目了,看不到这一点。干得好肯特!非常感谢。
    猜你喜欢
    • 2016-01-16
    • 2022-06-11
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2011-01-19
    • 2015-11-26
    相关资源
    最近更新 更多