在pandas dataframe

时间:2017-07-05 19:25:44

标签: python pandas

我有一个数据框,其中99列来自dx1-dx99,一列为LOS。 dxi列包含分类代码,它们没有任何顺序。代码可以出现在一行中的任何列中。代码可以在列中重复,但不会连续重复:

dx1 dx2 dx3 .   dx99    los
E10 I12 0 N18 R18       12
E10 I12 I31 E44 N17     7
E10 I12 N17 T86 0       5
I12 E10 N18 A04         1
E10 I12 B10 N18 Z99     4
E10 N18 Z76             1
E10 N18 Z99 N25 E78     8

我想计算数据框中每个代码的LOS平均值。我发现的只是我可以在多列上应用groupby()函数。但这并没有给我预期的结果。我需要这种格式的结果:

Codes    mean-LOS
E10      5.42    
I12      7.6
N18      5.2
.
.
etc.

1 个答案:

答案 0 :(得分:1)

您可以使用DataFrame.melt重新塑造groupby并汇总mean

df = df.melt('los', value_name='Codes')
#older version of pandas < 0.20.0
#df = pd.melt(df, 'los', value_name='Codes')
df = df.groupby('Codes', as_index=False)['los'].mean()
print (df)
   Codes        los
0      0   8.500000
1    A04   1.000000
2    B10   4.000000
3    E10   5.428571
4    E44   7.000000
5    E78   8.000000
6    I12   5.800000
7    I31   7.000000
8    N17   6.000000
9    N18   5.200000
10   N25   8.000000
11   R18  12.000000
12   T86   5.000000
13   Z76   1.000000
14   Z99   6.000000

如果需要重命名列:

df = df.melt('los', value_name='Codes')
df = df.groupby('Codes')['los'].mean().reset_index(name='mean-LOS')
print (df)
   Codes   mean-LOS
0      0   8.500000
1    A04   1.000000
2    B10   4.000000
3    E10   5.428571
4    E44   7.000000
5    E78   8.000000
6    I12   5.800000
7    I31   7.000000
8    N17   6.000000
9    N18   5.200000
10   N25   8.000000
11   R18  12.000000
12   T86   5.000000
13   Z76   1.000000
14   Z99   6.000000