2017-09-10 4 views
1

rolling(). agg를 사용하고 데이터 프레임에 열을 추가하고 있습니다.팬더 열 정렬 순서

A A/B A/B_mean A/B_std AB AB_mean AB_std AC AC_mean AC_std A_mean  A_std C/B C/B_mean C/B_std D D_mean  D_std 
0 3 4  NaN  NaN 6  NaN  NaN 7  NaN  NaN  NaN  NaN 2  NaN  NaN 0  NaN  NaN 
1 6 8  NaN  NaN 5  NaN  NaN 3  NaN  NaN  NaN  NaN 0  NaN  NaN 6  NaN  NaN 
2 6 0  NaN  NaN 5  NaN  NaN 7  NaN  NaN  NaN  NaN 5  NaN  NaN 2  NaN  NaN 
3 6 3  NaN  NaN 3  NaN  NaN 0  NaN  NaN  NaN  NaN 6  NaN  NaN 2  NaN  NaN 
4 3 1  3.2 3.114482 8  5.4 1.816590 0  3.4 3.507136  4.8 1.643168 2  3.0 2.449490 7  3.4 2.966479 
5 6 6  3.6 3.361547 8  5.8 2.167948 2  2.4 2.880972  5.4 1.341641 1  2.8 2.588436 3  4.0 2.345208 
6 2 6  3.2 2.774887 4  5.6 2.302173 6  3.0 3.316625  4.6 1.949359 4  3.6 2.073644 8  4.4 2.880972 
7 6 2  3.6 2.302173 3  5.2 2.588436 1  1.8 2.489980  4.6 1.949359 5  3.6 2.073644 2  4.4 2.880972 
8 1 8  4.6 2.966479 2  5.0 2.828427 4  2.6 2.408319  3.6 2.302173 4  3.2 1.643168 8  5.6 2.880972 
9 6 0  4.4 3.286335 3  4.0 2.345208 4  3.4 1.949359  4.2 2.489980 0  2.8 2.167948 5  5.2 2.774887 

은 A/B와 AB A_mean A_std 전에 정렬되어 어떤 이유 :

def add_mean_std_cols(df): 
    res = df.rolling(5).agg(['mean','std']) 

    res.columns = res.columns.map('_'.join) 

    final = res.join(df).sort_index(axis=1) 
    return final 

np.random.seed(20) 
df = pd.DataFrame(np.random.randint(0,9,size=(10, 6)), columns=list('ABCDEF')) 
print 
print df 
print 
df.columns = ['A', 'A/B','AB', 'AC', 'C/B', 'D'] 

print add_mean_std_cols(df) 

문제는 출력 열 이름 순서이다.

내가 선호하는 것이 순서는 다음과 같습니다 그것을 연주에서

A A_mean A_std ... 

는 '_'가 마지막으로 정렬 된 것으로 보인다.

원하는 순서를 얻는 방법에 대한 제안 사항이 있으십니까?

감사합니다.

+0

는 [그] (https://stackoverflow.com/a/46140511/5741205) 도움이되지습니까? – MaxU

+0

마지막 답변을하기 전에 질문을 게시했습니다 ... ValueError : 중복 축에서 색인을 다시 만들 수 없습니다. 어떤 오타가 있는지 검사하고 있습니다 ... – Diego

답변

0
In [60]: res = df.rolling(5).agg(['mean','std']) 

In [61]: res.columns = res.columns.map('_'.join) 

In [62]: cols = np.concatenate(list(zip(df.columns, res.columns[0::2], res.columns[1::2]))) 

In [63]: res.join(df).loc[:, cols] 
Out[63]: 
    A A_mean  A_std A/B A/B_mean A/B_std AB AB_mean AB_std AC AC_mean AC_std C/B C/B_mean C/B_std D D_mean \ 
0 3  NaN  NaN 4  NaN  NaN 6  NaN  NaN 7  NaN  NaN 2  NaN  NaN 0  NaN 
1 6  NaN  NaN 8  NaN  NaN 5  NaN  NaN 3  NaN  NaN 0  NaN  NaN 6  NaN 
2 6  NaN  NaN 0  NaN  NaN 5  NaN  NaN 7  NaN  NaN 5  NaN  NaN 2  NaN 
3 6  NaN  NaN 3  NaN  NaN 3  NaN  NaN 0  NaN  NaN 6  NaN  NaN 2  NaN 
4 3  4.8 1.643168 1  3.2 3.114482 8  5.4 1.816590 0  3.4 3.507136 2  3.0 2.449490 7  3.4 
5 6  5.4 1.341641 6  3.6 3.361547 8  5.8 2.167948 2  2.4 2.880972 1  2.8 2.588436 3  4.0 
6 2  4.6 1.949359 6  3.2 2.774887 4  5.6 2.302173 6  3.0 3.316625 4  3.6 2.073644 8  4.4 
7 6  4.6 1.949359 2  3.6 2.302173 3  5.2 2.588436 1  1.8 2.489980 5  3.6 2.073644 2  4.4 
8 1  3.6 2.302173 8  4.6 2.966479 2  5.0 2.828427 4  2.6 2.408319 4  3.2 1.643168 8  5.6 
9 6  4.2 2.489980 0  4.4 3.286335 3  4.0 2.345208 4  3.4 1.949359 0  2.8 2.167948 5  5.2 

     D_std 
0  NaN 
1  NaN 
2  NaN 
3  NaN 
4 2.966479 
5 2.345208 
6 2.880972 
7 2.880972 
8 2.880972 
9 2.774887 
+0

ValueError : 중복 축에서 색인을 다시 지을 수 없습니다. – Diego

+0

작동했습니다! 나는 오타가 있었어. 다시 한 번 감사드립니다 !!!! – Diego

+0

@Diego, 오신 것을 환영합니다. :) – MaxU

0

할 수 있습니다 MultiIndex에 의해 join 다음 sort_index :

def add_mean_std_cols(df): 
    res = df.rolling(5).agg(['mean','std']) 

    df.columns = [df.columns, [''] * len(df.columns)] 
    final = res.join(df).sort_index(axis=1) 
    final.columns = final.columns.map('_'.join).str.strip('_') 
    return final 


print (add_mean_std_cols(df)) 

    A A_mean  A_std A/B A/B_mean A/B_std AB AB_mean AB_std AC \ 
0 3  NaN  NaN 4  NaN  NaN 6  NaN  NaN 7 
1 6  NaN  NaN 8  NaN  NaN 5  NaN  NaN 3 
2 6  NaN  NaN 0  NaN  NaN 5  NaN  NaN 7 
3 6  NaN  NaN 3  NaN  NaN 3  NaN  NaN 0 
4 3  4.8 1.643168 1  3.2 3.114482 8  5.4 1.816590 0 
5 6  5.4 1.341641 6  3.6 3.361547 8  5.8 2.167948 2 
6 2  4.6 1.949359 6  3.2 2.774887 4  5.6 2.302173 6 
7 6  4.6 1.949359 2  3.6 2.302173 3  5.2 2.588436 1 
8 1  3.6 2.302173 8  4.6 2.966479 2  5.0 2.828427 4 
9 6  4.2 2.489980 0  4.4 3.286335 3  4.0 2.345208 4 

    AC_mean AC_std C/B C/B_mean C/B_std D D_mean  D_std 
0  NaN  NaN 2  NaN  NaN 0  NaN  NaN 
1  NaN  NaN 0  NaN  NaN 6  NaN  NaN 
2  NaN  NaN 5  NaN  NaN 2  NaN  NaN 
3  NaN  NaN 6  NaN  NaN 2  NaN  NaN 
4  3.4 3.507136 2  3.0 2.449490 7  3.4 2.966479 
5  2.4 2.880972 1  2.8 2.588436 3  4.0 2.345208 
6  3.0 3.316625 4  3.6 2.073644 8  4.4 2.880972 
7  1.8 2.489980 5  3.6 2.073644 2  4.4 2.880972 
8  2.6 2.408319 4  3.2 1.643168 8  5.6 2.880972 
9  3.4 1.949359 0  2.8 2.167948 5  5.2 2.774887 
+0

샘플 또는 실제 데이터에 문제가 있습니까? 판다 버전은 무엇입니까? – jezrael

+0

AttributeError : 'numpy.ndarray'객체에 'str'속성이 없습니다. – Diego

+0

Hmmm, 판다의 이전 버전에서 문제가 있다고 생각합니다. 버전 '0.16.0'에서'index.str.strip()'이 유용합니다. - http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#string-methods-enhancements – jezrael