2016-01-23 27 views
5

Nếu tôi có bảng:cột Xếp hạng và tên cột chọn

a b c 
15 15 5 
20 10 7 
25 30 9 

Và muốn làm hai điều 1) Chọn ra cột với giá trị cao nhất trên trục và gán nó vào một cột 2) Hãy giá trị và chỉ định nó cho một cột khác, chẳng hạn như:

a b c 1st 1st_value 2nd 2nd_value 3rd 3rd_value 
15 15 5 a/b 15 c 5 NaN NaN 
20 10 7 a 20 b 10 c 7 
25 30 9 b 30 a 25 c 9 

Điều này có khả thi không?

+0

Bạn đã thử mọi thứ chưa? – vk1011

+0

Điều duy nhất tôi đã quản lý để hoàn thành là chọn cột tối đa. Tôi đã thử đặt hàng các cột, nhưng điều này đặt hàng các cột trên tổng số tiền xuống cột, nếu điều đó có ý nghĩa. – DGraham

Trả lời

1

tôi có thể đề nghị bạn để giải quyết nó như thế này:

import pandas as pd 
import numpy as np 

df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}]) 
ext = {0: 'st', 1: 'nd', 2: 'rd'} 
cols = df.columns 


def make_ranking(row, rank=0, is_value=False): 
    values = list(row[cols]) 
    sorted_values = sorted(set(values), reverse=True) 
    value = sorted_values[rank] if len(sorted_values) > rank else np.nan 
    if not is_value: 
     items = [k for k, v in enumerate(values) if v == value] 
     value = '/'.join([cols[item] for item in items]) or np.nan 
    return value 

for i in range(len(cols)): 
    df[str(i+1)+ext[i]] = df.apply(make_ranking, args=(i, False,), axis=1) 
    df[str(i+1)+ext[i]+'_value'] = df.apply(make_ranking, args=(i, True,), axis=1) 

print(df) 

Kết quả:

a b c 1st 1st_value 2nd 2nd_value 3rd 3rd_value 
0 15 15 5 a/b   15 c   5 NaN  NaN 
1 20 10 7 a   20 b   10 c   7 
2 25 30 9 b   30 a   25 c   9 
+0

Nếu tôi chạy điều này, có vẻ như nó hoạt động ngoài các cột 2 và 3, không có giá trị nào xuất hiện ở đây? – DGraham

+0

@DGraham Hiện hoạt động tốt! –

+0

Công việc tuyệt vời, làm việc hoàn hảo! – DGraham

1
df_sorted = df.apply(lambda row: sorted(set(row), reverse=True) + [None]*(len(row)-len(set(row))), axis=1) 

>>> df_sorted 
    a b c 
0 15 5 NaN 
1 20 10 7 
2 30 25 9 

Đổi tên cột nếu bạn muốn:

df_sorted.rename(columns={'a': '1st_value', 'b': '2nd_value', 'c': '3rd_value'}, inplace=True) 

>>> df_sorted 
    1st_value 2nd_value 3rd_value 
0   15   5  NaN 
1   20   10   7 
2   30   25   9 

concat gốc và sắp xếp nếu bạn muốn:

df_concat = pd.concat([df, df_sorted], axis=1) 

>>> df_concat 
    a b c 1st_value 2nd_value 3rd_value 
0 15 15 5   15   5  NaN 
1 20 10 7   20   10   7 
2 25 30 9   30   25   9 
+0

Tôi có thể hỏi làm cách nào để biết được giá trị của cột nào? Vì vậy, ví dụ hàng 2, giá trị đến từ b. Điều này có thể không? – DGraham

Các vấn đề liên quan