Ten artykuł będzie działał trochę jak głosowy asystent na telefonie. Jak Siri albo Asystent Google. Będzie działał tak samo tylko inaczej.
Otóż będę tu zbierał krótkie snippety, na zasadzie chcę w Pandas zrobić to i to. Krótkie kodziki, które można skopiować i mieć od razu wynik.
Ten post jest “ciągłym draftem” – nowe informacje będą się tu pojawiać i pojawiać i pojawiać…
Do dzieła!
Hej Pandas, chcę…
… rozbić kolumnę ze stringiem na wiele kolumn
# po czym rozbijamy / chcemy nowe kolumny / nie ograniczamy liczby kolumn wynikowych
df["column"].str.split("-", expand=True, n=-1)
… jedną kolumnę podzielić na kilka
Zastosuj apply()
z funkcją, która zwraca słownik
# Ładnie
def first_and_last_from_split(row):
s_split = row["col_to_split"].split(", ")
row['col_1'] = s_split[0]
row['col_2'] = s_split[-1]
return row
df = df.apply(first_and_last_from_split, axis=1)
# Szybko
def first_and_last_from_split(s):
s_split = s.split(", ")
return s_split[0], s_split[-1]
df['col_1'], df['col_2'] = zip(*df['col_to_split'].apply(first_and_last_from_split))
… pokazać kolumny, które mają same NaN’y
df.columns[df.isna().all()].tolist()
… dodać kolumnę na podstawie wartości z innego DataFrame. Taki trochę VLOOKUP z Excela 😉
Mamy np. jeden DataFrame, w którym mamy nasze opisane dane i drugi, w którym mamy informację o wagach dla poszczególnych klasach. Możemy sobie dołożyć info o wagach do naszej DFki z danymi wykorzystując DataFrame.merge()
weighted_df = df.merge(labels_weights[["label", "weight"]], on="label", how="left”)
… połączyć dwa DataFrame (merge) z multiindexem zamiast suffixów
df = pd.concat([df_L, df_R], keys=['L','R'],axis=1).swaplevel(0,1,axis=1).sort_index(level=0, axis=1)
Albo sprytniej:
d = {'ABC' : df1, 'XYZ' : df2}
print pd.concat(d.values(), axis=1, keys=d.keys())
Przed
>>> df_L = pd.DataFrame({'X': [1, 3], 'Y': [5, 7]})
>>> df_R = pd.DataFrame({'X': [2, 4], 'Y': [6, 8]})
Suffixy
>>> df_L.join(df_R, lsuffix='_L', rsuffix='_R')Po
X_L Y_L X_R Y_R
0 1 5 2 6
1 3 7 4 8
>>> df
X Y
L R L R
0 1 2 5 6
1 3 4 7 8
… wyświetlić całego DataFrame a nie tylko początek i koniec
pd.set_option("display.max_rows", None, "display.max_columns", None)
… pokazać tylko te wiersze, które nie mają NULLa / NaNa
W żadnej z kolumn:
filtered_df = df[df.notnull().all(1)]
W wybranych kolumnach
filtered_df = df[df[[‘col1’, ‘col2']].notnull().all(1)]
Co najmniej jedna wartość nie jest NaNem:
filtered_df = df[df.notnull().any(1)]
Przykład
In []: df
Out[]:
a b c
0 1.0 1.0 w
1 NaN NaN NaN
2 3.0 NaN t
3 4.0 5.0 NaN
In []: df[df.notnull().all(1)]
Out[]:
a b c
0 1.0 1.0 w
In []: df[df[['a', 'c']].notnull().all(1)]
Out[]:
a b c
0 1.0 1.0 w
2 3.0 NaN t
In []: df[df.notnull().any(1)]
Out[]:
a b c
0 1.0 1.0 w
2 3.0 NaN t
3 4.0 5.0 NaN
… pogrupować DF i dostać liczbę rekordów w danej grupie
df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Obrazek w Nagłówku: Photo by Kunal Kalra on Unsplash