46

パンダに次のデータフレームがあるとします。

import numpy as np
df = pandas.DataFrame({"a": np.random.random(100), "b": np.random.random(100), "id": np.arange(100)})

との値でid構成される各ポイントの ID はどこにありますか? 指定したビンのセットにとをビン化するにはどうすればよいですか (各ビンのとの中央値/平均値を取得できます)。の任意の行に対して、または(または両方) の値を持つ可能性があります。abababdfNaNabdf

ジョー・キングトンのソリューションをより現実的なdf. よくわからないのは、以下の各グループのdf.b要素にアクセスする方法です。df.a

a = np.random.random(20)
df = pandas.DataFrame({"a": a, "b": a + 10})
# bins for df.a
bins = np.linspace(0, 1, 10)
# bin df according to a
groups = df.groupby(np.digitize(df.a,bins))
# Get the mean of a in each group
print groups.mean()
## But how to get the mean of b for each group of a?
# ...
4

4 に答える 4

16

Joe Kington の回答は非常に役に立ちましたが、すべてのデータがビン化されているわけではないことに気付きました。実際には、a = a.min() で行を除外します。合計するgroups.size()と、100 ではなく 99 になりました。

すべてのデータがビニングされることを保証するには、ビンの数を cut() に渡すだけで、その関数は自動的に最初の [最後の] ビンを 0.1% 埋めて、すべてのデータが含まれるようにします。

df = pandas.DataFrame({"a": np.random.random(100), 
                    "b": np.random.random(100) + 10})

# Bin the data frame by "a" with 10 bins...
groups = df.groupby(pandas.cut(df.a, 10))

# Get the mean of b, binned by the values in a
print(groups.mean().b)

この場合、groups.size() を合計すると 100 になりました。

これは、この特定の問題にとって厄介な点であることは承知していますが、私が解決しようとしていた同様の問題については、正しい答えを得ることが非常に重要でした。

于 2014-05-16T02:26:51.107 に答える