Pandas Dataframe

Oct 31 2020

Ho un dataframe contenente un numero di colonne e righe, in tutte le colonne tranne le due più a sinistra, ci sono dati della forma "intero-intero". Vorrei dividere tutte queste colonne in due colonne, con ogni numero intero nella propria cella, e rimuovere il trattino.

Ho provato a seguire le risposte in Pandas Dataframe: Dividi più colonne ciascuna in due colonne , ma sembra che si dividano dopo un elemento, mentre io vorrei dividerle sul "-".

A titolo di esempio, supponiamo di avere un dataframe del modulo:

Vorrei dividere le colonne etichettate da 2 a 22, per averle chiamate 2F, 2A, 3F, 3A, ..., 6A con i dati nella prima riga R1, Hawthorn, 229, 225, 91, 81, ..., 12.

Grazie per tutto l'aiuto.

Risposte

2 jezrael Oct 31 2020 at 13:48

È possibile utilizzare DataFrame.set_indexcon DataFrame.stackfor Series, quindi dividere in nuove 2 colonne per Series.str.split, convertire in numeri interi, creare nuovi nomi di colonne per DataFrame.set_axis, rimodellare DataFrame.unstack, ordinare le colonne per DataFrame.sort_indexe infine appiattire MultiIndexcon converti indice in colonne per 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

Per input:

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

Provando il codice:

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] 

Stampe (1a riga):

    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

puoi usare la funzione lambda per dividere una serie

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