熊猫分组并按比例表示

时间:2021-01-04 14:06:13

标签: python python-3.x pandas pandas-groupby

d = [{'name': 'tv', 'value': 10, 'amount': 35},
     {'name': 'tv', 'value': 10, 'amount': 14},
     {'name': 'tv', 'value': 15, 'amount': 23},
     {'name': 'tv', 'value': 34, 'amount': 56},
     {'name': 'radio', 'value': 90, 'amount': 35},
     {'name': 'radio', 'value': 90, 'amount': 65},
     {'name': 'radio', 'value': 100, 'amount': 50},
     {'name': 'dvd', 'value': 0.5, 'amount': 35},
     {'name': 'dvd', 'value': 0.2, 'amount': 40},
     {'name': 'dvd', 'value': 0.5, 'amount': 15}
     ]

df = pd.DataFrame(d)
dff = df.groupby(['name', 'value']).agg('sum').reset_index()
dfff = dff.groupby(['name']).apply(lambda x: round((x['amount']/x['amount'].sum())*100))
print(dff)
print(dfff)

    name  value  amount
0    dvd    0.2      40
1    dvd    0.5      50
2  radio   90.0     100
3  radio  100.0      50
4     tv   10.0      49
5     tv   15.0      23
6     tv   34.0      56


name    
dvd    0    44.0
       1    56.0
radio  2    67.0
       3    33.0
tv     4    38.0
       5    18.0
       6    44.0

我现在想要获取这个数据集并连接在 name 变量上分组的行。 amount 变量应表示为比例。

最终数据集应如下所示,其中 value 是第一项,amount 表示为比例是第二项。

    name  concatenated_values
0    dvd  0.2, 44%, 0.5, 56%
1  radio  90, 67%, 100, 33%
.
.
.

1 个答案:

答案 0 :(得分:2)

GroupBy.apply 中使用带有扁平嵌套列表的自定义 lambda 函数:

dff = df.groupby(['name', 'value']).agg('sum').reset_index()
dff['amount'] = ((dff['amount'] / dff.groupby(['name'])['amount'].transform('sum')*100)
                    .round().astype(int).astype(str) + '%')

f = lambda x:  ', '.join(str(z) for y in x.to_numpy() for z in y)
d = dff.groupby('name')[['value','amount']].apply(f).reset_index(name='concatenated_values')
print(d)
    name              concatenated_values
0    dvd               0.2, 44%, 0.5, 56%
1  radio            90.0, 67%, 100.0, 33%
2     tv  10.0, 38%, 15.0, 18%, 34.0, 44%
相关问题