具有以下数据框:
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
我想透视数据,将每行按名称值分组,然后根据汇总到bin中的value&count列创建列。
说明:我有10个可能的值,范围为0-9,并非每个组中都包含所有值。在上述示例中,组 B 缺少值1,2,3,4,7。我想创建一个具有5个bin的直方图,忽略缺失值并计算每个bin的计数百分比。因此结果将如下所示:
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
组的>总数 name 0-1
0 A (1+2)/20 = 0.15
我一直在研究hist method和this StackOverflow question,但仍在努力找出正确的方法。
答案 0 :(得分:2)
使用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)
原始数据中的空值不会影响结果。
答案 1 :(得分:1)
要获得确切的结果,您可以尝试一下。
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)
您可以稍后手动重命名cols。
# 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")
值