Nehmen wir an, ich habe einen einfachen Pandas DataFrame, bei dem eine Spalte einen Ländernamen enthält und eine andere Spalte einen Wert enthält. Beispielsweise:
# Import Python Libraries
import numpy as np
import pandas as pd
# Create Sample DataFrame
df = pd.DataFrame(data={'Country': ['United States','United States','United States','United States', \
'United States','United States','United States','United States', \
'United States','United States','United States','United States', \
'Canada','Canada','Canada','Canada','Canada','Canada','Mexico', \
'Mexico','Mexico','Mexico','England','England','England','England', \
'England','England','England','England','England','England','England', \
'England','England','England','France','France','France','Spain','Germany', \
'Germany','Germany','Germany','Germany','Germany','Germany','Germany', \
'Germany','Germany'], 'Value': np.random.randint(1000, size=50)})
Was erzeugt:
print(df.head())
Index Country Value
0 United States 943
1 United States 567
2 United States 534
3 United States 700
4 United States 470
Meine Frage ist, was ist der einfachste Weg in Python, diesen DataFrame in einen zu konvertieren, in dem jedes Land seine eigene Spalte hat und alle Werte dieses Landes in dieser Spalte aufgeführt sind? Mit anderen Worten, wie kann ich auf einfache Weise einen DataFrame erstellen, bei dem die Anzahl der Spalten die eindeutige Anzahl der Länder in der Spalte "Land" ist und die Länge jeder Spalte davon abhängt, wie oft das entsprechende Land im ursprünglichen DataFrame vorkommt? ?
Hier ist Beispielcode, der eine Lösung bietet:
# Store Unique Country Names in Variable
columns = df['Country'].unique()
# Create Individual Country DataFrames
df_0 = df[df['Country'] == columns[0]]['Value'].values.tolist()
df_1 = df[df['Country'] == columns[1]]['Value'].values.tolist()
df_2 = df[df['Country'] == columns[2]]['Value'].values.tolist()
df_3 = df[df['Country'] == columns[3]]['Value'].values.tolist()
df_4 = df[df['Country'] == columns[4]]['Value'].values.tolist()
df_5 = df[df['Country'] == columns[5]]['Value'].values.tolist()
df_6 = df[df['Country'] == columns[6]]['Value'].values.tolist()
# Create Desired Output DataFrame
data_dict = {columns[0]: df_0, columns[1]: df_1, columns[2]: df_2, columns[3]: df_3, columns[4]: df_4, columns[5]: df_5, columns[6]: df_6}
new_df = pd.DataFrame({k:pd.Series(v[:len(df)]) for k,v in data_dict.items()})
Was erzeugt:
print(new_df)
United States Canada Mexico England France Spain Germany
0 838.0 135.0 496.0 568.0 71.0 588.0 811.0
1 57.0 118.0 268.0 716.0 422.0 NaN 107.0
2 953.0 396.0 850.0 860.0 707.0 NaN 318.0
3 251.0 294.0 815.0 888.0 NaN NaN 633.0
4 127.0 466.0 NaN 869.0 NaN NaN 910.0
5 892.0 824.0 NaN 776.0 NaN NaN 472.0
6 11.0 NaN NaN 508.0 NaN NaN 466.0
7 563.0 NaN NaN 299.0 NaN NaN 200.0
8 864.0 NaN NaN 568.0 NaN NaN 637.0
9 810.0 NaN NaN 78.0 NaN NaN 392.0
10 268.0 NaN NaN 106.0 NaN NaN NaN
11 389.0 NaN NaN 153.0 NaN NaN NaN
12 NaN NaN NaN 217.0 NaN NaN NaN
13 NaN NaN NaN 941.0 NaN NaN NaN
Obwohl der obige Code funktioniert, ist er offensichtlich keine haltbare Lösung für größere Datensätze. Wie kann dieses Ergebnis am effizientesten aus dem ursprünglichen DataFrame generiert werden?
Vielen Dank!
Wahrscheinlich nicht die performanteste Lösung da draußen, aber es wird alles top gerechtfertigt.
df1 = df.groupby('Country').Value.agg(list).apply(pd.Series).T
df1.columns.name=None
Ausgabe: df1
Canada England France Germany Mexico Spain United States
0 653.0 187.0 396.0 491.0 251.0 433.0 919.0
1 215.0 301.0 25.0 107.0 755.0 NaN 435.0
2 709.0 581.0 858.0 691.0 158.0 NaN 166.0
3 626.0 706.0 NaN 572.0 767.0 NaN 352.0
4 516.0 999.0 NaN 393.0 NaN NaN 906.0
5 847.0 688.0 NaN 780.0 NaN NaN 489.0
6 NaN 722.0 NaN 19.0 NaN NaN 322.0
7 NaN 728.0 NaN 166.0 NaN NaN 753.0
8 NaN 765.0 NaN 299.0 NaN NaN 155.0
9 NaN 956.0 NaN 449.0 NaN NaN 438.0
10 NaN 41.0 NaN NaN NaN NaN 588.0
11 NaN 43.0 NaN NaN NaN NaN 796.0
12 NaN 485.0 NaN NaN NaN NaN NaN
13 NaN 218.0 NaN NaN NaN NaN NaN
Die andere Möglichkeit besteht darin, die Justify-Funktion von Coldspeed und die Pivot-Ausgabe von Yuca zu verwenden:
import numpy as np
df2 = df.pivot(index=None, columns='Country', values='Value')
df2 = pd.DataFrame(
justify(df2.values, invalid_val=np.NaN, axis=0, side='up'),
columns=df2.columns
).dropna(0, 'all')
df2.columns.name=None
Ausgabe: df2
Canada England France Germany Mexico Spain United States
0 653 187 396 491 251 433 919
1 215 301 25 107 755 NaN 435
2 709 581 858 691 158 NaN 166
3 626 706 NaN 572 767 NaN 352
4 516 999 NaN 393 NaN NaN 906
5 847 688 NaN 780 NaN NaN 489
6 NaN 722 NaN 19 NaN NaN 322
7 NaN 728 NaN 166 NaN NaN 753
8 NaN 765 NaN 299 NaN NaN 155
9 NaN 956 NaN 449 NaN NaN 438
10 NaN 41 NaN NaN NaN NaN 588
11 NaN 43 NaN NaN NaN NaN 796
12 NaN 485 NaN NaN NaN NaN NaN
13 NaN 218 NaN NaN NaN NaN NaN
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen