【发布时间】:2018-11-20 21:21:56
【问题描述】:
假设我想使用 pandas 数据框中的一些数据。
>>> df = pd.DataFrame([['a',10,5],['a',12,6],['b',4,2],['b',5,10]],
... columns=['id','val','val2']))
所以数据框看起来像这样:
>>> df
id val val2
0 a 10 5
1 a 12 6
2 b 4 2
3 b 5 10
我想要实现的是一个数据框,其中包含 id 值作为列名,val 和 val2 作为行名,其中的值应按以下方式组成:
-
根据
id构建值列的平均值,留下类似id mean-val mean-val2 a 11 5.5 b 4.5 6 -
根据
id(例如11 / (11+5.5) * 100 = 66.67)计算mean-val和mean-val2在两个值之和上的百分比,渲染id perc-val perc-val2 a 66.67 33.33 b 42.86 57.14
最终的数据框应如下所示:
>>> new_df
a b
val 66.67 42.86
val2 33.33 57.14
我的方法
我对 pandas 非常缺乏经验,所以我花了一段时间才得到一个不满意的方法。
>>> idx = ['val','val2']
>>> lst = [df.groupby('id')[index].mean() for index in idx]
>>> df_new = pd.DataFrame(
... [[x/y*100 for x, y in zip(lst2,sum(lst))] for lst2 in lst],
... index=idx, columns=df['id'].unique())
这可行,但我不确定是否保证列或行以正确的顺序命名,或者是否有可能,例如,a 列被命名为 b,反之亦然反之亦然。
所以我的实际问题是,是否有更好、更清洁、更安全、或许更有效的方法来做到这一点。
【问题讨论】: