Pandas Dataframe
Mam ramkę danych zawierającą wiele kolumn i wierszy, we wszystkich kolumnach z wyjątkiem dwóch skrajnych po lewej znajdują się dane w postaci „liczba całkowita-liczba całkowita”. Chciałbym podzielić wszystkie te kolumny na dwie kolumny, z każdą liczbą całkowitą w osobnej komórce, i usunąć myślnik.
Próbowałem podążać za odpowiedziami w Pandas Dataframe: Podziel wiele kolumn każda na dwie kolumny , ale wydaje się, że są one dzielone po jednym elemencie, podczas gdy chciałbym podzielić na „-”.
Przykładowo załóżmy, że mam ramkę danych w postaci:
Chciałbym podzielić kolumny oznaczone od 2 do 22, aby nazwać je 2F, 2A, 3F, 3A, ..., 6A, a dane w pierwszym wierszu to R1, Hawthorn, 229, 225, 91, 81, ..., 12.
Dziękuję za pomoc.
Odpowiedzi
Możesz użyć DataFrame.set_indexz DataFrame.stackfor Series, a następnie podzielić na nowe 2 kolumny według Series.str.split, przekonwertować na liczby całkowite, utworzyć nowe nazwy kolumn według DataFrame.set_axis, zmienić kształt według DataFrame.unstack, sortować kolumny według DataFrame.sort_indexi ostatnio spłaszczyć MultiIndexz konwersją indeksu na kolumny według DataFrame.reset_index:
#first replace columns names to default values
df.columns = range(len(df.columns))
df = (df.set_index([0,1])
.stack()
.str.split('-', expand=True)
.astype(int)
.set_axis(['F','A'], axis=1, inplace=False)
.unstack()
.sort_index(axis=1, level=[1,0], ascending=[True, False]))
df.columns = df.columns.map(lambda x: f'{x[1]}{x[0]}')
df = df.reset_index()
print (df)
0 1 2F 2A 3F 3A 4F 4A 5F 5A 6F 6A
0 R1 Hawthorn 229 225 91 81 216 142 439 367 7 12
1 R2 Sydney 226 214 93 92 151 167 377 381 12 8
2 R3 Geelong 216 228 91 166 159 121 369 349 16 14
3 R4 North Melbourne 213 239 169 126 142 155 355 394 8 9
4 R5 Gold Coast 248 226 166 94 267 169 455 389 18 6
5 R6 St Kilda 242 197 118 161 158 156 466 353 15 16
6 R7 Fremantle 225 219 72 84 224 185 449 464 7 5
Do wprowadzenia:
df = pd.DataFrame({0: ['R1'], 1: ['Hawthorn'], 2: ['229-225'], 3: ['91-81'], 4:['210-142'], 5:['439-367'], 6:['7-12']})
0 1 2 3 4 5 6
0 R1 Hawthorn 229-225 91-81 210-142 439-367 7-12
Próbowanie kodu:
for i in df.columns[2::]:
df[[str(i)+'F', str(i)+'A']] =pd.DataFrame(df[i].str.split('-').tolist(), index= df.index)
del df[i]
Wydruki (1. rząd):
0 1 2F 2A 3F 3A 4F 4A 5F 5A 6F 6A
0 R1 Hawthorn 229 225 91 81 210 142 439 367 7 12
możesz użyć funkcji lambda do podziału serii
import pandas as pd
df = pd.read_csv("data.csv")
df.head()
>>> data
0 12-24
1 13-26
2 14-28
3 15-30
df["d1"] = df["data"].apply(lambda x: x.split("-")[0])
df["d2"] = df["data"].apply(lambda x: x.split("-")[1])
df.head()
>>>
data d1 d2
0 12-24 12 24
1 13-26 13 26
2 14-28 14 28
3 15-30 15 30