2

データフレーム内の複数の配列の要素単位の標準偏差を取得する方法を、最初の3行は次のようになります。はPythonは:私は、各セルではなく、大きなデータフレーム(DF)を含む配列とはNaNを持って

df: 
       A    B    C 
X [4, 8, 1, 1, 9]    NaN [8, 2, 8, 4, 9] 
Y [4, 3, 4, 1, 5] [1, 2, 6, 2, 7] [7, 1, 1, 7, 8] 
Z    NaN [9, 3, 8, 7, 7] [2, 6, 3, 1, 9] 

私はすでに、私はこれを取得するように各列の行の上に意味要素単位取る方法(thanks to piRSquared)を知っている:

element_wise_mean: 
A      [4.0, 5.5, 2.5, 1.0, 7.0] 
B      [5.0, 2.5, 7.0, 4.5, 7.0] 
C [5.66666666667, 3.0, 4.0, 4.0, 8.66666666667] 

今、私はそれぞれの標準偏差、任意のアイデアを取得する方法だろうか?また、私はまだgroupby()がやっていることを理解していない、誰かがその関数をより詳しく説明できますか?


np.random.seed([3,14159]) 
df = pd.DataFrame(
    np.random.randint(10, size=(3, 3, 5)).tolist(), 
    list('XYZ'), list('ABC') 
).applymap(np.array) 

df.loc['X', 'B'] = np.nan 
df.loc['Z', 'A'] = np.nan 

element_wise_mean

df2    = df.stack().groupby(level=1) 
element_wise_mean = df2.apply(np.mean, axis=0) 

element_wise_sd

element_wise_sd = df2.apply(np.std, axis=0) 
TypeError: setting an array element with a sequence. 
DF numpy arrayに変換して、ラムダを使用してnp.std適用
+1

numpyの配列の値に試してみてください - 'df2.apply(ラムダX:NPを。 std(x.values)) '? – Zero

+0

私はあなたの種の価値を見て非常に満足している誰かを知っています。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅはそれがpirsquaredですか? – Dark

答えて

3

は私のために働いている:

commentから
element_wise_std = df2.apply(lambda x: np.std(np.array(x), 0)) 
#axis=0 is by default, so can be omit 
#element_wise_std = df2.apply(lambda x: np.std(np.array(x))) 
print (element_wise_std) 
A       [0.0, 2.5, 1.5, 0.0, 2.0] 
B       [4.0, 0.5, 1.0, 2.5, 0.0] 
C [2.62466929134, 2.16024689947, 2.94392028878, ... 
dtype: object 

または解決策:

element_wise_std = df2.apply(lambda x: np.std(x.values, 0)) 
print (element_wise_std) 
A       [0.0, 2.5, 1.5, 0.0, 2.0] 
B       [4.0, 0.5, 1.0, 2.5, 0.0] 
C [2.62466929134, 2.16024689947, 2.94392028878, ... 
dtype: object 

私はより多くを説明してみてください:stackによって

まずリシェイプ - 列がindexに追加され、Multiindexが作成されます。 (値ABCによる)とapplyいくつかの機能 -

print (df.stack()) 
X A [4, 8, 1, 1, 9] 
    C [8, 2, 8, 4, 9] 
Y A [4, 3, 4, 1, 5] 
    B [1, 2, 6, 2, 7] 
    C [7, 1, 1, 7, 8] 
Z B [9, 3, 8, 7, 7] 
    C [2, 6, 3, 1, 9] 
dtype: object 

そしてgroupby(level=1)は、第Multiindexのレベルによって基を意味します。ここはnp.stdです。

パンダさんはarrayと一緒に働いていないか、非常にいいですので、変換が必要です。 (これはバグのように見える)Jezraelはこれに私を打つ

+1

パンダの列はシーケンスです。この場合、各シーケンスは配列です。パンダの実装がこの配列の配列を使ってうまくいきません。 'x.values'または' np.array(x) 'を実行することによって、列は明示的に2D配列に変換されます。奇妙なことに、それはおそらくパンダギターに何が起こっているのかを知るための問題を提起するだろう。 –

+0

@KenSyme - いいアイデア - 私はそれを投稿する[ここ](https:// github。 com/pandas-dev/pandas/issues/17571)。 – jezrael

+0

すばらしいおかげで! np.mean nd np.stdは同じデータセットでは異なる動作をする必要がありますが、実際にはこのように動作します。あなたはなぜそれがそうであるか聞いたら、あなたから再び聞きたいです。 –

2

.groupby()に関するご質問に答えるために、.apply(print)を試してみてください。あなたが返されるかを見ると、apply関数で使用されるようになされます:

df2 = df.stack().groupby(axis=1) #groups by the second index of df.stack() 
df2.apply(print) 
X A [4, 8, 1, 1, 9] 
Y A [4, 3, 4, 1, 5] 
Name: A, dtype: object 
Y B [1, 2, 6, 2, 7] 
Z B [9, 3, 8, 7, 7] 
Name: B, dtype: object 
X C [8, 2, 8, 4, 9] 
Y C [7, 1, 1, 7, 8] 
Z C [2, 6, 3, 1, 9] 
Name: C, dtype: object 

逆に、試してみてください。

df3 = df.stack().groupby(level=0) #this will group by the first index of df.stack() 
df3.apply(print) 
X A [4, 8, 1, 1, 9] 
    C [8, 2, 8, 4, 9] 
Name: X, dtype: object 
Y A [4, 3, 4, 1, 5] 
    B [1, 2, 6, 2, 7] 
    C [7, 1, 1, 7, 8] 
Name: Y, dtype: object 
Z B [9, 3, 8, 7, 7] 
    C [2, 6, 3, 1, 9] 
Name: Z, dtype: object 
+0

.apply(print)は、何が起こっているのかを視覚化するために必要なものでした。 –

関連する問題