2016-11-06 18 views
0

私はパンダで働いています。パンダでグルーピング、平均計算

これが私のデータである。各列は大陸(SA、NA、EA、島、海洋、AUS、AF)、ステータス(絶滅し、歴史的、導入、または現存)、注文、科、属、あるhttp://www.esapubs.org/archive/ecol/E084/094/MOMv3.3.txt 種、対数塊、混合塊、および参照をそれぞれ示している。

私は各大陸の絶滅種と現存種の大量を比較しようとしています。したがって、私はこのデータフレームを '大陸'と '地位'でグループ化し、各グループの平均塊 - 絶滅した種と現存する種 - を各種について計算する必要があります。 (例えば、大陸AF内のすべての絶滅種の平均混合質量、次に大陸AF内のすべての現存種の平均混合質量など)を計算する必要があります。

私はcsvファイル(各行の最初のエントリは大陸)、2番目のエントリはその大陸の現存種の平均質量、3番目のエントリはその大陸の絶滅種の平均質量、4番目のエントリはその大陸現存している平均の平均質量と平均の平均質量の間にある。

これは、これまでの私のコードです:

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ファイルにエクスポートする方法もあります。

誰でも助けてください!

答えて

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']] 

利回りあなたはその後、CSVにresultを書くためにresult.to_csv('out.csv')を使用することができ

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 


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レベルのマルチインデックスを有しています。レベルはcontinentstatusです。 ...私は唯一の絶滅/現存状況で探していますように、forループを作成するにはどのような方法があります修正のため

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 
+0

ありがとう:列にstatusインデックス・レベルを移動するには、unstack methodを使用しています。私はこの冒頭をおそらく作成できますか?そして、あなたが提案した2番目の方法を使用しますか?私は、私が見ている各グループを指定するために、このコードをコピーして貼り付けなくても、最も効率的なコードが必要です。次のグループはget_group(( "AF"、 "現存")) –

+0

指定されたCSVファイルを作成するための最も簡単で効率的な方法は何ですか? –