2016-01-23 9 views
5

Gdybym miał tabelę:kolumny rankingowe i wybraniu nazwy kolumn

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

i chciał zrobić dwie rzeczy 1) Wybierz się kolumnę o najwyższej wartości w poprzek osi i przypisać go do kolumny 2) Podjęcie wartość i przypisz ją do innej kolumny, na przykład:

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 

Czy to możliwe?

+0

Czy próbowałeś coś? – vk1011

+0

Jedyne, co udało mi się ukończyć, to wybrać maksymalną kolumnę. Próbowałem już zamawiać kolumny, ale to rozkazuje kolumny na całkowitą sumę w dół kolumny, jeśli to ma sens. – DGraham

Odpowiedz

1

mogę zaproponować Ci go rozwiązać tak:

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) 

Wyjście:

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

Jeśli to uruchomię, wydaje się, że działa niezależnie od kolumn 2 i 3, nie ma tu żadnych wartości? – DGraham

+0

@DGraham Teraz działa dobrze! –

+0

Świetna robota, działa idealnie! – 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 

Zmiana nazwy kolumny, jeśli chcesz:

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 oryginał i sortowane, jeśli chcesz:

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

Czy mogę zapytać, skąd będę wiedzieć, do której kolumny należą te wartości? Na przykład w wierszu 2 wartość pochodzi z b. czy to możliwe? – DGraham

Powiązane problemy