2016-03-01 22 views
5

Pandaları ve numpy'yi kullanma Veri çerçevesindeki bir sütunu işlemeye çalışıyorum ve ilgili değerlere sahip yeni bir sütun oluşturmak istiyorum. Yani değer x sütununda 1 varsa, yeni sütunda bir olurdu, değeri 2 için bu vbnp.where çoklu dönüş değerleri

bekar koşulları için bunu yapabilirsiniz

, yani

df['new_col'] = np.where(df['col_1'] == 1, a, n/a) 

Ve I b olurdu Birden fazla koşulun örneğini bulabiliriz, yani x = 3 veya x = 4 ise değer a olmalıdır, ama x = 3 gibi bir şey yapmamalı, değer bir olmalıdır ve x = 4 ise değer c olmalıdır.

Sadece gibi iki kod satırları çalışan çalıştı:

df['new_col'] = np.where(df['col_1'] == 1, a, n/a) 
df['new_col'] = np.where(df['col_1'] == 2, b, n/a) 

Ancak belli ikinci hat üzerine yazar. Çok önemli bir şeyi mi özlüyorum?

cevap

7

Sana loc kullanabilirsiniz düşünüyorum:

df.loc[(df['col_1'] == 1, 'new_col')] = a 
df.loc[(df['col_1'] == 2, 'new_col')] = b 

Veya:

df['new_col'] = np.where(df['col_1'] == 1, a, np.where(df['col_1'] == 2, b, np.nan)) 
0

Bir dicti tanımlayabiliriz istediğiniz dönüşümleri ile. Daha sonra bir DataFrame sütunu boyunca ilerleyin ve doldurun.

daha şık bir yolu, ama bu var çalışacaktır olabilir:

# create a dummy DataFrame 
df = pd.DataFrame(np.random.randint(2, size=(6,4)), columns=['col_1', 'col_2', 'col_3', 'col_4'], index=range(6) ) 

# create a dict with your desired substitutions: 
swap_dict = { 0 : 'a', 
       1 : 'b', 
      999 : 'zzz', } 

# introduce new column and fill with swapped information: 
for i in df.index: 
    df.loc[i, 'new_col'] = swap_dict[ df.loc[i, 'col_1'] ] 

print df 

döner gibi bir şey:

col_1 col_2 col_3 col_4 new_col 
0  1  1  1  1  b 
1  1  1  1  1  b 
2  0  1  1  0  a 
3  0  1  0  0  a 
4  0  0  1  1  a 
5  0  0  1  0  a 
1

Ben choose() sizin için en iyi seçenektir numpy düşünüyorum.

import numpy as np 
choices = 'abcde' 
N = 10 
np.random.seed(0) 
data = np.random.randint(1, len(choices) + 1, size=N) 
print(data) 
print(np.choose(data - 1, choices)) 

Çıktı:

[5 1 4 4 4 2 4 3 5 1] 
['e' 'a' 'd' 'd' 'd' 'b' 'd' 'c' 'e' 'a'] 
0

pandalar yerine Series.map kullanın.

import pandas as pd 
df = pd.DataFrame({'col_1' : [1,2,4,2]}) 
print(df) 

def ab_ify(v): 
    if v == 1: 
     return 'a' 
    elif v == 2: 
     return 'b' 
    else: 
     return None 

df['new_col'] = df['col_1'].map(ab_ify) 
print(df) 

# output: 
# 
# col_1 
# 0  1 
# 1  2 
# 2  4 
# 3  2 
# col_1 new_col 
# 0  1  a 
# 1  2  b 
# 2  4 None 
# 3  2  b