2

dataframe에서 여러 배열의 요소 현명한 표준 편차를 활용하는 방법, 처음 3 행은 다음과 같이 :파이썬 : 나는 각 셀에 오히려 큰 dataframe (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] 
나는 각각의 표준 편차를 얻는 방법을 궁금해 지금 어떤 생각을

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] 

:

나는 이미 내가 이것을 얻을 수 있도록 (thanks to piRSquared) 어떻게 각 열에 대한 행을 통해 현명한 요소을 의미하는 알아? 또한, 나는 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. 
012,351,641 DF numpy array에 변환과 람다를 사용하여 np.std 적용는
+1

이 NumPy와 배열 값에 시도 -'df2.apply (람다 X : NP. std (x.values))'? – Zero

+0

나는 당신의 종자 가치를보기 매우 행복 할 누군가를 안다. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ는 그게 pirsquared입니까? – Dark

답변

3

나를 위해 노력하고 있습니다 :

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 

또는 솔루션 comment에서 :

먼저 모양 변경을 stack 기준 :

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 

내가 더 설명하려고 - 열이 index에 추가되고 Multiindex이 생성됩니다. 및 apply 일부 기능 (값 A, B, C 의해) -

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으로 작동하지 않거나 매우 훌륭하므로 목록을 작성해야합니다.

에 대한 .groupby(), .apply(print)을 시도 귀하의 질문에 대답하려면

+1

팬더 열은 시퀀스이며,이 경우 각 시퀀스는 배열입니다.pandas 구현이이 배열 시퀀스를 사용하여 멋지게 재생되지 않는 것처럼 보입니다. 'x.values' 또는'np.array (x)'를 수행하면 명시 적으로 2D 배열로 변환되므로 이후에는 작동합니다. 이상한 것은'평균'이 아니라'표준'과 함께 작동합니다. 아마도 팬더 기스 츠에서 다른 일이 벌어 질 수 있는지에 대한 이슈를 제기 할 것입니다. –

+0

@KenSyme - 좋은 생각 - 저는 여기에 게시합니다 (https : // github. com/pandas-dev/pandas/issues/17571). – jezrael

+0

놀라운 감사! 그것은 np.mean과 np.std가 동일한 데이터 세트에서 다르게 행동해야한다는 것을 직관적으로 반박합니다. 그러나 실제로이 방법으로 작동합니다. 왜 그런지 들으면 다시 듣고 싶습니다. –

2

Jezrael이 저를 이길 (이것은 버그처럼 보인다). 당신은 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 (인쇄) 정확히 무슨 일이 있었는지 시각화하는 데 필요한, 무리 감사합니다! –