Pandas Dataframe
Ich habe einen Datenrahmen, der eine Anzahl von Spalten und Zeilen enthält. In allen Spalten mit Ausnahme der beiden ganz links befinden sich Daten der Form "Ganzzahl-Ganzzahl". Ich möchte alle diese Spalten in zwei Spalten mit jeder Ganzzahl in einer eigenen Zelle aufteilen und den Bindestrich entfernen.
Ich habe versucht, den Antworten in Pandas Dataframe zu folgen : Teilen Sie mehrere Spalten in zwei Spalten auf , aber es scheint, dass sie nach einem Element aufgeteilt werden, während ich das "-" teilen möchte.
Angenommen, ich habe einen Datenrahmen des Formulars:
Ich möchte die mit 2 bis 22 bezeichneten Spalten aufteilen, damit sie 2F, 2A, 3F, 3A, ..., 6A heißen, wobei die Daten in der ersten Zeile R1, Hawthorn, 229, 225, 91, 81, sind. ..., 12.
Vielen Dank für jede Hilfe.
Antworten
Sie können DataFrame.set_indexmit DataFrame.stackfor verwenden Series, dann in neue 2 Spalten aufteilen Series.str.split, in Ganzzahlen konvertieren, neue Spaltennamen erstellen nach DataFrame.set_axis, umformen DataFrame.unstack, Spalten sortieren nach DataFrame.sort_indexund zuletzt reduzieren MultiIndexmit Index in Spalten konvertieren nach 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
Für die Eingabe:
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
Den Code ausprobieren:
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]
Drucke (1. Reihe):
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
Sie können die Lambda-Funktion zum Teilen einer Reihe verwenden
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