2016-09-24 4 views
2

4 열이있는 팬더 데이터 프레임 df이 있습니다. 열이 foo1은,에서는 foo2, foo3 및 foo4팬더에서 조건부로 열을 교환하는 방법

있습니다

foo1 foo2  foo3 foo4 
egg  cheese 2  1 
apple pear  1  3 
french spanish 10 1 

나는 또한 foo3 및 foo4 때 foo3 < foo4 열을 교환 foo1은과에서는 foo2과 열을 교환하고 싶습니다 예를 들어 여기에 장난감 예이다. 그래서 결과는 다음과 같습니다

foo1  foo2 foo3 foo4 
cheese egg  1  2 
apple pear 1  3 
spanish french 1  10 

나는 df[df['foo3'] < df['foo4']]로 교환 할 필요 행을 찾을 수 있지만 내가 어떻게 효율적으로 교환 할 수 있습니다. 내 데이터 프레임이 큽니다.

당신은 조건에 따라 새로운 데이터 프레임을 구성하는 pandas.Series.where 기능을 사용할 수 있습니다
+0

http://stackoverflow.com/questions/24036911/how-to-update-values-in-a-specific-row-in-a-python-pandas-dataframe – postelrich

답변

1

: 당신은 예, df[df['foo3'] < df['foo4']]로 행을 찾을 수 있습니다

pairs = [('foo1', 'foo2'), ('foo3', 'foo4')] # construct pairs of columns that need to swapped 

df_out = pd.DataFrame() 

# for each pair, swap the values if foo3 < foo4 
for l, r in pairs: 
    df_out[l] = df[l].where(df.foo3 < df.foo4, df[r]) 
    df_out[r] = df[r].where(df.foo3 < df.foo4, df[l]) 

df_out 
#  foo1 foo2 foo3 foo4 
#0 cheese egg  1  2 
#1 apple pear  1  3 
#2 spanish french  1 10 
2

하지만, 대신 부울 시리즈를 사용하는 경우, 당신은 쉽게 달성 할 수 목표 :

s = df['foo3'] < df['foo4'] 
df.loc[s, ['foo1','foo2']] = df.loc[s, ['foo2','foo1']].values 
df.loc[s, ['foo3','foo4']] = df.loc[s, ['foo4','foo3']].values 

주, 당신은 목적을 훼손 열 이름에 정렬에서 팬더를 방지하기 위해 RHS의 끝에서 .values이 필요합니다.

+0

동일한 foo3과 foo4를 바꿀 수 있습니까? 시각? – eleanora

+0

가능합니다. 예. Go 파이썬 동시 할당 !!! 당신이 그것을 시험해보고, 당신이 충돌을 치면 나에게 알려주지 왜 ..? – Kartik

관련 문제