2017-06-15 14 views
2

Hyあります。pandas aggregate dataframeは1列のみを返します

私はこのようなパンダのデータフレーム(DF)を持っている:

 foo id1 bar id2 
0 8.0 1 NULL 1 
1 5.0 1 NULL 1 
2 3.0 1 NULL 1 
3 4.0 1  1 2 
4 7.0 1  3 2 
5 9.0 1  4 3 
6 5.0 1  2 3 
7 7.0 1  3 1 
... 

私はID1とID2によってグループ化すると、fooとbarの平均値を取得しよう。

マイコード:

res = df.groupby(["id1","id2"])["foo","bar"].mean() 

は、私は何を取得することは、私が期待するものはほとんどです:

  foo 
id1 id2   
1 1 5.750000 
    2 7.000000 
2 1 3.500000 
    2 1.500000 
3 1 6.000000 
    2 5.333333 

列「foo」というの値が正確に平均値(手段)です私は探しています私の列はどこにありますか?しかし、私はこのため (申し訳ありませんが、 「選択平均ID1、ID2により、データフレームのグループから(FOO)、平均(バー)」:

だから、SQLだろう場合、私はからのような結果を探していましたパンダへのSQL人との新しいよりますが、私は今それを必要とする)

私が代わりにしようとしたもの:。まだ列「bar」を欠落している、私はまったく同じ結果が得られる

groupedFrame = res.groupby(["id1","id2"]) 
aggrFrame = groupedFrame.aggregate(numpy.mean) 

を。

サイトでは、私が読んで:

私は間違っていますか? - 前もってありがとう。

答えて

3

カラムbarは数値ではないため、集計機能では省略されています。

あなたはomited列のdtypeを確認することができます - 数値ではありません。

print (df['bar'].dtype) 
object 

あなたはautomatic exclusion of nuisance columnsを確認することができます。

: - stringsと数値可能使用 replaceある

df['bar'] = pd.to_numeric(df['bar'], errors='coerce') 
res = df.groupby(["id1","id2"])["foo","bar"].mean() 
print (res) 
      foo bar 
id1 id2   
1 1 5.75 3.0 
    2 5.50 2.0 
    3 7.00 3.0 

しかし、データを混在している場合:numericstring値を変換し、可能でない場合は、to_numericおよびパラメータerrors='coerce'NaN Sを追加集計前に

ソリューションです

df['bar'] = df['bar'].replace("NULL", np.nan) 
+0

どうもありがとうございました。今それは正常に動作します。おそらく、NULLがsqlと同じではないことを忘れていました。 –

+0

喜んで助けることができます;) – jezrael

1

前述のように、平均値をとる前にNULL値を置き換えてください。

df.replace("NULL",-1).groupby(["id1","id2"])["foo","bar"].mean() 

出力

id1 id2 foo bar 
1 1 5.75 3.0 
1 2 5.5 2.0 
1 3 7.0 3.0 
関連する問題