具有以下数据框架:
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我希望将数据枢轴,按名称值对每一行进行分组,然后根据聚合到回收箱中的value & count列创建列。
解释:我有10个可能的值,范围为0-9,并不是每个组中都有所有的值。在上面的示例组中,B缺少值1,2,3,4,7。我想创建一个有5个回收箱的直方图,忽略丢失的值,并计算每个回收站的计数百分比。结果会是这样的:
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例如,对于A组的bin 0-1,计算为0,1 (1+2)值的计数之和,除以A的total_count。
name 0-1
0 A (1+2)/20 = 0.15我正在研究hist法和这个StackOverflow问题,但仍然在努力找出正确的方法。
发布于 2018-09-17 06:00:05
为了得到确切的结果,你可以试试这个。
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")值。
发布于 2018-09-16 12:35:46
使用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)原始数据中的空值不会影响结果。
https://stackoverflow.com/questions/52353954
复制相似问题