按所有列分组的pandas分发表

时间:2016-03-21 20:53:24

标签: python python-2.7 pandas dataframe

我有一个 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

有一种简单的方法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您应该能够使用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