代码之家  ›  专栏  ›  技术社区  ›  Shlomi Schwartz

Python-从列透视并创建直方图,但缺少值

  •  1
  • Shlomi Schwartz  · 技术社区  · 6 年前

    具有以下数据帧:

       name  value  count  total_count
    0     A      0      1           20
    1     A      1      2           20
    2     A      2      2           20
    3     A      3      2           20
    4     A      4      3           20
    5     A      5      3           20
    6     A      6      2           20
    7     A      7      2           20
    8     A      8      2           20
    9     A      9      1           20
    ----------------------------------
    10    B      0     10           75
    11    B      5     30           75
    12    B      6     20           75
    13    B      8     10           75
    14    B      9      5           75
    

    我想透视数据,按名称值对每一行进行分组,然后根据值创建列&对聚合到存储箱中的列进行计数。

    解释 :我有10个可能的值,范围为0-9,并非所有值都存在于每组中。在上面的示例组中

      name       0-1  2-3  4-5  6-7       8-9
    0    A  0.150000  0.2  0.3  0.2  0.150000
    1    B  0.133333  0.0  0.4  0.4  0.066667
    

    例如bin 计算值为0,1(1+2)的计数之和除以 总计数 组的 A

      name       0-1
    0    A       (1+2)/20 = 0.15
    

    hist method this StackOverflow question ,但仍在努力找出正确的方法。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sai Kumar    6 年前

    为了得到准确的结果,你可以试试这个。

    bins=range(10)
    res = df.groupby('name')['count'].sum()
    intervals = pd.cut(df.value, bins=bins, include_lowest=True)
    df1 = (df.groupby([intervals,"name"])['count'].sum()/res).unstack(0)
    
    df1.columns = df1.columns.astype(str)  # convert the cols to string
    df1.columns = ['a','b','c','d','e','f','g','h','i']  # rename the cols
    cols = ['a',"b","d","f","h"]
    
    df1 = df1.add(df1.iloc[:,1:].shift(-1, axis=1), fill_value=0)[cols]
    print(df1)
    

    以后可以手动重命名列。

    # Output:
               a         b     d        f        h 
    name                    
       A    0.150000    0.2   0.3   0.200000    0.15
       B    0.133333    NaN   0.4   0.266667    0.20
    

    NaN 值使用 df1.fillna("0.0")

        2
  •  2
  •   Kavi Sek    6 年前

    pd.cut 若要将功能放入垃圾箱,请使用 df.groupby().count() 以及 .unstack() 方法获取要查找的数据帧。在分组过程中,您可以使用任何聚合函数(.sum()、.count()等)来获取您要查找的结果。如果您正在寻找一个示例,下面的代码可以工作。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        data ={'name': ['Group A','Group B']*5,
               'number': np.arange(0,10), 
               'value': np.arange(30,40)})
    df['number_bin'] = pd.cut(df['number'], bins=np.arange(0,10))
    # Option 1: Sums
    df.groupby(['number_bin','name'])['value'].sum().unstack(0)
    # Options 2: Counts
    df.groupby(['number_bin','name'])['value'].count().unstack(0)