【问题标题】:pandas distribution table grouped by all columns按所有列分组的熊猫分布表
【发布时间】:2016-03-21 20:53:23
【问题描述】:

我有一个 pandas 数据框,如下所示,我想汇总并获取每个唯一记录的分布:

      col1   col2    col3  
0       1      3       0  
1       1      2       0  
2       1      2       0  
3       1      5       1  
4       1      3       1  
5       1      5       0  

我想得到一个如下所示的数据框:

       col1   col2    col3   distribution
0       1      3       0         0.166
1       1      3       1         0.166
2       1      2       0         0.333
3       1      5       1         0.166
4       1      5       0         0.166

有没有简单的方法来做到这一点?

【问题讨论】:

  • 你的分布函数是什么?

标签: python python-2.7 pandas dataframe


【解决方案1】:

您可以将groupbycount 一起使用,使用reset_index 创建新列distribution 并将其除以sum

df = df.groupby(['col1','col2','col3'])['col1'].count().reset_index(name='distribution')
df['distribution'] = df['distribution'] / df['distribution'].sum()
print df
   col1  col2  col3  distribution
0     1     2     0      0.333333
1     1     3     0      0.166667
2     1     3     1      0.166667
3     1     5     0      0.166667
4     1     5     1      0.166667

【讨论】:

    【解决方案2】:

    假设包含数据的数据框称为df,遍历每一行(这会将行作为一个系列返回),计算分布(假设此处为标准差)并在末尾附加一个新列。例如:

    distribution = list()
    for row in df.iterrows():
      distribution.append(row[1].std())
    df['distribution'] = distribution
    

    【讨论】:

      【解决方案3】:

      您应该能够使用 apply 并沿正确的轴指定它。在这个例子中,我找到了每一行的平均值,但是你可以使用你的分布函数:

      import pandas as pd
      import numpy as np
      
      df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=['c1','c2','c3'])
      
      df
         c1  c2  c3
      0   1   2   3
      1   4   5   6
      2   7   8   9
      
      df.loc[:, 'row_mean'] = df.apply(np.mean, axis=1)
      
      df
         c1  c2  c3  row_mean
      0   1   2   3         2
      1   4   5   6         5
      2   7   8   9         8
      

      【讨论】:

      • 对不起,如果不清楚,我想要的不是每一行的平均值,而是每个唯一记录的频率,通过对所有列进行分组,所以在我的示例中,每个唯一的 c1、c2、c3 组合1, 2, 0 出现两次,然后除以总行数
      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2021-11-11
      • 2020-03-24
      • 1970-01-01
      相关资源
      最近更新 更多