Pandas Dataframe

Oct 31 2020

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

2 jezrael Oct 31 2020 at 13:48

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
sharathnatraj Oct 31 2020 at 14:19

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
CodePerfectPlus Oct 31 2020 at 14:46

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