Odbuduj pandy Dataframe za pomocą instrukcji if
Jak już zadawano w innym pytaniu z tytułem „Odbuduj pandy Dataframe”, wciąż mam kilka pytań dotyczących tworzenia jeszcze większej liczby kolumn.
Sytuacja: Mam ramkę danych z 4 kolumnami, wartości wewnątrz kolumn są dość losowe. Tak jak ten przykład:
df = pd.DataFrame({'col1': ['id 1', 'id 2', 'test 3', 'test 4'],
'col2': ['test 1', 'test 2',
'ne 5261', 'id 4'],
'col3': ['Number 12344', 'Number 21612','id 3','Number 1131'],
'col4':['ne 315','Number 1264777','ne 1415','ne 52']})
Moim celem jest posiadanie ramki danych, w której każda kolumna ma tylko wartości zaczynające się od tego samego podłańcucha, jak w tym przykładzie:
To, co już zadziałało dla 3 kolumn, to następujący kod (od kredytów z ostatniego pytania do: @AndrejKesely):
def key_fn(x):
if 'id' in x:
return 0
if 'test' in x:
return 1
if 'Number' in x:
return 2
return 3
df = pd.DataFrame([sorted(l, key=key_fn) for l in df.values], columns=df.columns)
drukuj (df)
Ponieważ mam teraz 4 kolumny, dodałem kolejną instrukcję if do funkcji, wyglądającą następująco:
def key_fn(x):
if 'id' in x:
return 0
if 'test' in x:
return 1
if 'Number' in x:
return 2
if 'ne' in x:
return 3
return 4
df = pd.DataFrame([sorted(l, key=key_fn) for l in df.values], columns=df.columns)
To daje mi następujący wynik:
To jest mały przykład, kiedy rozumiem, jak to działa, muszę zastosować go do łącznie 17 kolumn. Z góry dziękuję za Twoją pomoc!
Odpowiedzi
df = pd.DataFrame({'col1': ['id 1', 'id 2', 'test 3', 'test 4'],
'col2': ['test 1', 'test 2',
'ne 5261', 'id 4'],
'col3': ['Number 12344', 'Number 21612','id 3','Number 1131'],
'col4':['ne 315','Number 1264777','ne 1415','ne 52']})
def key_fn(x):
if 'id' in x:
return 0
if 'test' in x:
return 1
if 'Number' in x:
return 2
if 'ne' in x:
return 3
return 4
out_df = pd.DataFrame(np.array(sorted(np.ravel(df.values), key=key_fn)).reshape(df.shape), columns=df.columns).T
print(out_df)
Wydruki:
col1 col2 col3 col4
0 id 1 test 1 Number 12344 ne 315
1 id 2 test 2 Number 21612 ne 5261
2 id 3 test 3 Number 1264777 ne 1415
3 id 4 test 4 Number 1131 ne 52