我有一个 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
有一种简单的方法吗?
答案 0 :(得分:1)
您可以将groupby
与count
一起使用,使用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