在大熊猫中分组,计算平均值

时间:2016-11-06 13:13:16

标签: python loops pandas

我正在和熊猫一起工作。

这是我的数据:http://www.esapubs.org/archive/ecol/E084/094/MOMv3.3.txt 每列是大陆(SA,NA,EA,岛屿,海洋,澳大利亚,AF),状态(灭绝,历史,介绍或现存),订单,家庭,属,物种,对数质量,组合质量和参考,分别

我试图比较每个大陆的大量已灭绝和现存的物种。因此,我需要将这个数据框组合为“大陆”和“状态”,然后计算出每个物种的每个群体的平均质量 - 已灭绝和现存的物种。 (例如,我需要计算出大陆AF中所有已灭绝物种的平均总质量,然后是非洲大陆所有现存物种的平均总质量。等等。)

我想创建一个csv文件,其中每行的第一个条目是大陆,第二个条目是该大陆上现存物种的平均质量,第三个条目是该大陆上已灭绝物种的平均质量,第四个条目是平均现存和平均灭绝质量之间的差异。

到目前为止,这是我的代码:

import pandas as pd
url="http://www.esapubs.org/archive/ecol/E084/094/MOMv3.3.txt"
mammalian_data = pd.read_csv(url, delimiter="\t", header=None, 
names= ['continent', 'status', 'order', 'family', 'genus', 'species', 'log mass', 'combined mass', 'reference'])

AF_extant = mammalian_data.groupby(["continent", "status"]).get_group(("AF","extant"))
print(AF_extant["combined mass"].mean())
AF_extinct = mammalian_data.groupby(["continent", "status"]).get_group(("AF","extinct"))
print(AF_extinct["combined mass"].mean())

如何为7大洲的每一个重复此代码?如何使用此信息创建新数据框,然后导出到包含所有必要条目的CSV文件 - 如上所述。

任何人都可以帮忙!

1 个答案:

答案 0 :(得分:2)

import pandas as pd
url="http://www.esapubs.org/archive/ecol/E084/094/MOMv3.3.txt"
mammalian_data = pd.read_csv(
    url, delimiter="\t", header=None, 
    names=['continent', 'status', 'order', 'family', 'genus',
           'species', 'log mass', 'combined mass',
           'reference'])

result = mammalian_data.groupby(["continent", "status"])['combined mass'].mean()
result = result.unstack('status')
result['diff'] = result['extinct']-result['extant']
result = result[['extant', 'extinct', 'diff']]

产量

status           extant        extinct           diff
continent                                            
AF         2.220823e+04  970038.461538  947830.232208
AUS        1.691833e+04  188355.555556  171437.228736
Af        -9.990000e+02            NaN            NaN
EA         2.114960e+04            NaN            NaN
Insular    7.757171e+03   81912.131034   74154.960145
Oceanic    8.238885e+06            NaN            NaN
SA         3.864696e+03  973072.402597  969207.706264

然后,您可以使用result.to_csv('out.csv')result写入CSV。

mammalian_data.groupby(["continent", "status"])['combined mass'].mean()计算所有组的所有方法:

In [35]: mammalian_data.groupby(["continent", "status"])['combined mass'].mean()
Out[35]: 
continent  status      
AF         extant          2.220823e+04
           extinct         9.700385e+05
           historical      1.475138e+05
AUS        extant          1.691833e+04
           extinct         1.883556e+05
           historical      2.653043e+03
           introduction    1.797469e+05
Af         extant         -9.990000e+02
EA         extant          2.114960e+04
           historical      2.014170e+05
Insular    extant          7.757171e+03
           extinct         8.191213e+04
           historical      8.433233e+04
Oceanic    extant          8.238885e+06
SA         extant          3.864696e+03
           extinct         9.730724e+05
Name: combined mass, dtype: float64

本系列有一个2级MultiIndex。级别为continentstatus。要将status索引级别移至列,请使用unstack method

In [36]: mammalian_data.groupby(["continent", "status"])['combined mass'].mean().unstack()
Out[36]: 
status           extant        extinct     historical   introduction
continent                                                           
AF         2.220823e+04  970038.461538  147513.750000            NaN
AUS        1.691833e+04  188355.555556    2653.043478  179746.852941
Af        -9.990000e+02            NaN            NaN            NaN
EA         2.114960e+04            NaN  201417.000000            NaN
Insular    7.757171e+03   81912.131034   84332.326000            NaN
Oceanic    8.238885e+06            NaN            NaN            NaN
SA         3.864696e+03  973072.402597            NaN            NaN