2016-08-12 101 views
4

我有兩列年齡和性別的熊貓數據幀如何比較熊貓中的兩列製作第三列?

sex = ['m', 'f' , 'm', 'f', 'f', 'f', 'f'] 
age = [16 , 15 , 14 , 9 , 8 , 2 , 56 ] 

現在我想提取第三列:這樣 如果年齡< = 9,然後輸出的「孩子」,如果年齡> 9,然後輸出各自的性別

sex = ['m', 'f' , 'm','f' ,'f' ,'f' , 'f'] 
age = [16 , 15 , 14 , 9  , 8  , 2  , 56 ] 
yes = ['m', 'f' ,'m' ,'child','child','child','f' ] 

請幫忙 ps。我仍然在做這個工作,如果我得到什麼,我會立即更新

回答

9

使用numpy.where

df['col3'] = np.where(df['age'] <= 9, 'child', df['sex']) 

輸出結果:

age sex col3 
0 16 m  m 
1 15 f  f 
2 14 m  m 
3 9 f child 
4 8 f child 
5 2 f child 
6 56 f  f 

時序

使用下面的設置獲得更大的示例DataFrame:

np.random.seed([3,1415]) 
n = 10**5 
df = pd.DataFrame({'sex': np.random.choice(['m', 'f'], size=n), 'age': np.random.randint(0, 100, size=n)}) 

我得到以下計時:

%timeit np.where(df['age'] <= 9, 'child', df['sex']) 
1000 loops, best of 3: 1.26 ms per loop 

%timeit df['sex'].where(df['age'] > 9, 'child') 
100 loops, best of 3: 3.25 ms per loop 

%timeit df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1) 
100 loops, best of 3: 3.92 ms per loop 
+0

這是這樣工作np.where(條件,如果做到這一點,否則這樣做)? –

+0

是的,這是正確的。 – root

+0

這似乎很好用,雖然df.apply看起來很直觀:) –

4

你可以使用pandas.DataFrame.where。例如

child.where(age<=9, sex) 
+1

這裏的語法不正確。如果你想使用'DataFrame.where',它應該是這樣的:'df ['sex']。where(df ['age']> 9,'child')'。 – root

2
df = pd.DataFrame({'sex':['m', 'f' , 'm', 'f', 'f', 'f', 'f'], 
    'age':[16, 15, 14, 9, 8, 2, 56]}) 
df['yes'] = df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1) 

結果:

age sex yes 
0 16 m  m 
1 15 f  f 
2 14 m  m 
3 9 f child 
4 8 f child 
5 2 f child 
6 56 f  f