2017-09-07 2 views
0

for 루프를 사용하여 레벨 0 인덱스를 사용하지 않고 multiindex 데이터 프레임 (기본적으로 groupby 설명 데이터 프레임)에 함수를 적용하고 싶습니다. 내 dataframe의pandas 멀티 인텍스에 함수 적용

def CI(x): 
    import math 
    sigma = x["std"] 
    n = x["count"] 
    return 1.96 * sigma/math.sqrt(n) 

샘플 : 내가 좋아하는 것

기능 적용

df = df.iloc[47:52, [3,4,-1]] 

       a   b     id 
47   0.218182 0.000000 0d1974107c6731989c762e96def73568 
48   0.000000 0.000000 0d1974107c6731989c762e96def73568 
49   0.218182 0.130909 0d1974107c6731989c762e96def73568 
50   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 
51   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 

을 그리고 유모와 0을 대체 :

df = df.replace(float(0), np.nan) 

Groupy를 ID와 설명 멀티 인덱스를 얻었습니다 :

df_group = df.groupby("id").describe() 

는 내가 좋아하고 생각하지 않는다 현재 솔루션을 향상시킬 수있다 : I는 A에서 Z까지 최고 수준의 열이있는 경우, 그래서 다시

        a  b 
id 
06f32e6e45da385834dac983256d59f3 nan  nan 
0d1974107c6731989c762e96def73568 0.005 0.225 
0fd4f3b4adf43682f08e693a905b7432 0.008 nan 
11e0057cdc8b8e1b1cdabfa8a092ea5f 0.018 0.582 
120549af6977623bd01d77135a91a523 0.008 0.204 

:

l_df = [] 
for column in df_group.columns.levels[0]: 
    df = pd.DataFrame({"CI" : df_group[column].apply(CI, axis = 1)}) 
    l_df.append(df) 
CI = pd.concat(l_df, axis = 1) 
CI.columns = df_group.columns.levels[0] 

그래서 내가 뭔가를 얻을 , 그리고 각각은 std와 count 열을 포함하고 있습니다. 어떻게이 각각의 열에 동시에 함수를 적용 할 수 있습니까?

+0

df가 응답을 당신에게 존 감사 CI 필요가 없습니다. 그것은 더 짧은 해결책이지만, 원칙적으로 그것은 나의 해결책을 바꾸고 있습니다. 나는 루프 (loop) 나리스트 comprehensions없이 multiindex 레벨에서 작동 할 수있는 pandas 내의 메소드가 있는지 알고 싶었다. – LostBoardOnTaurangaBeach

+0

Genius! 이것은 내가 찾고 있던 대답이다. 당신은 groupby를 여러 번 수행하는 것이 정상이라고 생각했고, 람다를 재귀 적으로 사용하는 방법을 생각했습니다. 매우 감사! 포인트를 보상 할 수 있도록 답변을 게시해야합니다 (올바르게 보상 시스템을 이해하는 경우 - 신종) – LostBoardOnTaurangaBeach

+0

답변으로 추가했습니다. – Zero

답변

1

levelaxis=1groupby을 사용하여 첫 번째 레벨 열을 반복하고 적용 해 보겠습니다. 당신이

In [105]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1).apply(lambda x: x[x.name] 
      .apply(lambda x: 1.96*x['std']/np.sqrt(x['count']), axis=1))) 
Out[105]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

샘플에 있다면

In [104]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1) 
      .apply(lambda x: x[x.name].apply(CI, axis=1))) 
Out[104]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

Infact는, 당신은

In [106]: df 
Out[106]: 
      a   b        id 
47 0.218182  NaN 0d1974107c6731989c762e96def73568 
48  NaN  NaN 0d1974107c6731989c762e96def73568 
49 0.218182 0.130909 0d1974107c6731989c762e96def73568 
50  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
51  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
+0

답변 해 주셔서 감사합니다. jupyter notebook에서 복사하려고 할 때 포맷이 망가졌고 손으로 수정해야했기 때문에 stackoverflow에 결과를 어떻게 인쇄하고 있는지 물어볼 수 있습니다. – LostBoardOnTaurangaBeach

+0

https://meta.stackexchange.com/questions/216464/how-to-insert-code-properly-on-stack-overflow 및 https://stackoverflow.com/questions/20109391/how-to-make- 재현성 좋은 판다 - 예 – Zero