Pandas Dataframe
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
È 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
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
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