2016-03-01 17 views
5

Sử dụng gấu trúc và ô chữ Tôi cố gắng xử lý một cột trong một khung dữ liệu và muốn tạo một cột mới với các giá trị liên quan đến nó. Vì vậy, nếu trong cột x giá trị 1 là hiện nay, trong cột mới nó sẽ là một, cho giá trị 2 nó sẽ là b vvnp.where nhiều giá trị trả về

tôi có thể làm điều này với điều kiện duy nhất, tức là

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

Và tôi có thể tìm thấy ví dụ về nhiều điều kiện tức là nếu x = 3 hoặc x = 4 giá trị nên a, nhưng không làm điều gì đó giống như nếu x = 3 giá trị phải là a và nếu x = 4 thì giá trị là c.

Tôi đã cố gắng đơn giản là chạy hai dòng mã như:

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

Nhưng rõ ràng là dòng thứ hai ghi đè. Tôi có thiếu cái gì đó quan trọng không?

Trả lời

7

Tôi nghĩ rằng bạn có thể sử dụng loc:

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

Hoặc:

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

bạn có thể định nghĩa một dict với biến đổi mong muốn của bạn. Sau đó, lặp qua cột DataFrame và điền vào.

Có thể một cách thanh lịch hơn, nhưng điều này sẽ làm việc:

# 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 

lợi nhuận gì đó như:

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

Tôi nghĩ NumPy choose() là lựa chọn tốt nhất cho bạn.

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)) 

Output:

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

Sử dụng gấu trúc Series.map thay vì ở đâu.

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 
Các vấn đề liên quan