代码之家  ›  专栏  ›  技术社区  ›  swifty

pandas-一组列和另一组列相加[关闭]

  •  2
  • swifty  · 技术社区  · 6 年前

    我有一套价格和金额-amt1是价格1的总数量。

    对我来说,价格太精确了,我想根据价格将价格/金额对分组/装箱/汇总到等间距的桶中,然后根据金额进行合计。

    例如,我的原始df:

    index    price1 price2 price3 price4 amt1 amt2 amt3 amt4
    1          451    454    462    470   10    1   2   5
    2          448    452    458    464   8     2   6   2
    3          461    463    468    480   1     3   6   9
    4          453    455    471    481   4     3   2   4
    

    会产生:

    index bin1 bin2 bin3 bin4 bin5 amt1 amt2 amt3 amt4 amt5
    1     440  450  460  470  480   0    11   2    5    0
    2     440  450  460  470  480   8     8   2    0    0
    3     440  450  460  470  480   0     0  10    0    9
    4     440  450  460  470  480   0     7   0    2    4
    

    需要注意的几点:

    • 我选择10个数量的垃圾箱。
    • BIN1表示440-449。
    • 价格总是按升序排列。
    • 我实际上有500个价格/体积对要计算(1000列df),所以需要进行缩放。
    • 速度实际上是优先考虑的(尽管乞丐不能挑三拣四)。

    感谢任何帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    首先创建带组的扁平数据帧,用于按 numpy.ravel numpy.repeat :

    a = df.filter(like='price').values.ravel()
    b = df.filter(like='amt').values.ravel()
    c = np.repeat(np.arange(len(df)), len(df.filter(like='price').columns))
    df = pd.DataFrame({'bin':a, 'amt':b, 'g':c})
    print (df)
        bin  amt  g
    0   451   10  0
    1   454    1  0
    2   462    2  0
    3   470    5  0
    4   448    8  1
    5   452    2  1
    6   458    6  1
    7   464    2  1
    8   461    1  2
    9   463    3  2
    10  468    6  2
    11  480    9  2
    12  453    4  3
    13  455    3  3
    14  471    2  3
    15  481    4  3
    

    然后通过 cut -我尝试动态创建标签和箱子按楼层划分和多个按 10 ,然后汇总 sum 被重塑 unstack :

    val = (df['bin'] // 10)
    labels = np.arange(val.min() * 10, val.max() * 10 + 10, 10)
    bins = np.append(labels, val.max() * 10 + 10)
    
    df = (df.groupby(['g', pd.cut(df['bin'], bins=bins, labels=labels, right=False)])['amt'].sum()
           .unstack(fill_value=0))
    print (df)
    bin  440  450  460  470  480
    g                           
    0      0   11    2    5    0
    1      8    8    2    0    0
    2      0    0   10    0    9
    3      0    7    0    2    4
    

    上次创建执行的格式 df -添加新列依据 assign join 起初的 东风 使用重命名的列:

    cols1 = ['bin{}'.format(x) for x in range(1, len(df.columns) + 1)]
    cols2 = ['amt{}'.format(x) for x in range(1, len(df.columns) + 1)]
    
    d1= dict(zip(cols1, df.columns))
    d2= dict(zip(df.columns, cols2))
    
    df1 = pd.DataFrame(index=df.index).assign(**d1).join(df.rename(columns=d2))
    print (df1)
       bin1  bin2  bin3  bin4  bin5  amt1  amt2  amt3  amt4  amt5
    g                                                            
    0   440   450   460   470   480     0    11     2     5     0
    1   440   450   460   470   480     8     8     2     0     0
    2   440   450   460   470   480     0     0    10     0     9
    3   440   450   460   470   480     0     7     0     2     4