Pandas Dataframe

Oct 31 2020

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

2 jezrael Oct 31 2020 at 13:48

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

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

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