Hilfe bei der Selektion aus einem Data Frame

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Karambit
User
Beiträge: 7
Registriert: Mittwoch 26. August 2020, 15:37

Hallo,

ich brauche bitte Hilfe bei der Selektion:

df_2020_high --> Hier sind sämtliche Länder und ihre Bevölkerungsstruktur aus dem Jahr 2020 drin.

In Locs befinden sich die IDs der Länder.

for i in locs:
# df_2020_high_modDF = df_2020_high.append({'Total' : df_2020_high[df_2020_high['LocID'] == i]['PopTotal'].sum()} , ignore_index=True)

Ich wollte über eine Schleife zu jeder ID eine neue Zeile mit der Summe der aktuellen ID eingfügen bzw.
wie kann ich mir die Summe von 'PopTotal' plus die 'Location' ausgeben lassen?
print( df_2020_high[['Location', df_2020_high['LocID'] == i ]['PopTotal'].sum() ] )

Letzendlich will ich ein Feld und die Summe aus einem Feld des Arrays auslesen lassen, aber leider funktoniert das nicht so einfach.
Kann mir jemand bitte ein ähnliches Beispiel nennen? Google und meine Aufzeichnungen konnten mir in diesem Fall auch nicht weiterhelfen.

Viele Grüße
Karambit
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Karambit: Ich werde aus der Beschreibung nicht wirklich schlau. Wenn ich raten müsste suchst Du so etwas wie Gruppieren nach ID und dann Aggregation per Gruppe.

Sind die Daten öffentlich verfügbar und kannst Du das mal mit Beispieldaten zeigen was Du hast und was Du als Ergebnis haben willst?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

@__blackjack__ Für mich klingt es so, als sollte das was du beschreibst nur mit den Ländern, welche in der schlecht benannten Liste `locs` stehen, passieren.
Ich versuche mal mein Glück:
*Glaskugel an*

Code: Alles auswählen

# nur die Länder finden, deren LocID in `locs` steht:
df[df["LocID"].isin(locs)]
# diese nach LocID gruppieren und aufsummieren:
df[df["LocID"].isin(locs)].groupby("LocID").sum()
*Glaskugel aus*
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich das Gruppieren und Summieren nach LocID etwas komisch finde, denn das würde ja bedeuten das a) die LocID in diesem Fall nicht eindeutig ist, und b) es Sinn macht über die Gesamtpopulation bei gleicher LocID und was immer die Datensätze mit gleicher LocID unterscheidet, zu summieren.

Ich habe mal mit den wenigen Informationen nach einem passenden Datensatz im Netz gesucht und eine Projektion der Bevölkerungsentwicklung gefunden wo auch 2020 enthalten ist, und da sehe ich nicht wie es sinnvoll sein kann PopTotal nach LocID zu summieren. Hier die Datenquelle: https://population.un.org/wpp/Download/Standard/CSV/
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Karambit
User
Beiträge: 7
Registriert: Mittwoch 26. August 2020, 15:37

Hallo,

vielen Dank erstmal für eure Kommentare!
Es geht mir nicht darum, ob es Sinn macht oder nicht, sondern ich will verstehen, wie man das machen könnte.

(Kann man eigentlich hier auch Screenshots oder Bilder vom eigenen Laufwerk einfügen?)

LocID
Location
VarID
Variant
Time
MidPeriod
AgeGrp
AgeGrpStart
AgeGrpSpan
PopMale
PopFemale
PopTotal


LocID steht immer für ein Land und im Feld AgeGrp wird nach der Altersstruktur unterteilt, so gibt es immer ein PopTotal, dass sich nur auf diese Altersgruppe (Male + Female) bezieht.
Ich hätte gerne noch neben dem PopTotal ein Total, dass die Gesamtbevölkerung dieses Landes immer mit anzeigt.
Das wäre dann die Summe aller PopTotal-Felder zu einer LocID.

Ist das ungefähr verständlich?

Viele Grüße
Karambit
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da hat einfachTobi ja bereits gezeigt wie das geht (df4 = WPP2019_PopulationByAgeSex_Medium.csv nach 2020 gefiltert):

Code: Alles auswählen

In [127]: df4.groupby("LocID")["PopTotal"].sum()                                
Out[127]: 
LocID
4         38928.341
8          2877.800
12        43851.043
24        32866.268
28           97.928
           ...     
2097     635156.773
2098     368869.644
2099      42677.809
5500      74338.926
5501    1940369.605
Name: PopTotal, Length: 443, dtype: float64
Gegenprobe aus der "WPP2019_TotalPopulationBySex.csv" nach 2020 und Medium gefiltert:

Code: Alles auswählen

In [136]: df2[df2["LocID"] == 4]["PopTotal"]                                                                                                                                                                                                                                   
Out[136]: 
70    38928.341
Name: PopTotal, dtype: float64
Jup, stimmt überein.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Karambit
User
Beiträge: 7
Registriert: Mittwoch 26. August 2020, 15:37

Vielen Dank!

Was ich eigentlich möchte ist folgendes:

LocID gibt es unterschiedlichen Ausprägungen, d.h., dass es Prob Land (LocID, Location) eine Unterteilung der Bevölkerungsstruktur gibt (AgeGrp) und somit das PopTotal sich immer auf die Summe von PopMale und PopFemale bezieht (PopTotal), aber ich will einfach noch danebene ein PopGesamt haben, dass immer die Summe von PopTotal aus dem LocID darstellt (das Land).

Kann man eigentlich Screenshots hier hochladen?
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Karambit: Wie gesagt, das sollte eigentlich beantwortet sein. Der `df4` aus meinem letzten Beitrag enthält die Daten für 2020 und addiert alle "PopTotal" pro "LocID" auf.

Code: Alles auswählen

In [142]: df4.info()                                                            
<class 'pandas.core.frame.DataFrame'>
Int64Index: 9303 entries, 1470 to 1403072
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   LocID        9303 non-null   int64  
 1   Location     9303 non-null   object 
 2   VarID        9303 non-null   int64  
 3   Variant      9303 non-null   object 
 4   Time         9303 non-null   int64  
 5   MidPeriod    9303 non-null   float64
 6   AgeGrp       9303 non-null   object 
 7   AgeGrpStart  9303 non-null   int64  
 8   AgeGrpSpan   9303 non-null   int64  
 9   PopMale      9303 non-null   float64
 10  PopFemale    9303 non-null   float64
 11  PopTotal     9303 non-null   float64
dtypes: float64(4), int64(5), object(3)
memory usage: 944.8+ KB

In [143]: df4["Time"].unique()                                                  
Out[143]: array([2020])

In [144]: df4[df4["LocID"] == 4]                                                
Out[144]: 
      LocID     Location  VarID  ...   PopMale  PopFemale  PopTotal
1470      4  Afghanistan      2  ...  2907.406   2765.103  5672.509
1471      4  Afghanistan      2  ...  2774.630   2641.593  5416.223
1472      4  Afghanistan      2  ...  2651.664   2540.450  5192.114
1473      4  Afghanistan      2  ...  2377.941   2251.504  4629.445
1474      4  Afghanistan      2  ...  2017.279   1909.206  3926.485
1475      4  Afghanistan      2  ...  1610.796   1498.590  3109.386
1476      4  Afghanistan      2  ...  1299.121   1179.138  2478.259
1477      4  Afghanistan      2  ...  1068.167    988.220  2056.387
1478      4  Afghanistan      2  ...   868.020    790.703  1658.723
1479      4  Afghanistan      2  ...   677.226    627.510  1304.736
1480      4  Afghanistan      2  ...   529.188    503.171  1032.359
1481      4  Afghanistan      2  ...   411.379    396.460   807.839
1482      4  Afghanistan      2  ...   305.081    307.557   612.638
1483      4  Afghanistan      2  ...   215.637    229.221   444.858
1484      4  Afghanistan      2  ...   140.254    172.197   312.451
1485      4  Afghanistan      2  ...    76.897     91.107   168.004
1486      4  Afghanistan      2  ...    33.115     42.490    75.605
1487      4  Afghanistan      2  ...    10.185     14.275    24.460
1488      4  Afghanistan      2  ...     2.053      3.139     5.192
1489      4  Afghanistan      2  ...     0.215      0.414     0.629
1490      4  Afghanistan      2  ...     0.011      0.028     0.039

[21 rows x 12 columns]
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Karambit
User
Beiträge: 7
Registriert: Mittwoch 26. August 2020, 15:37

Hallo Black_Jack,

vielen Dank für deine Antwort. Das was du geschrieben hast, war mir klar, aber trotzdem noch einmal vielen Dank!

Ich möchte einfach nur in dem Array noch eine Reihe haben namens 'Total', die direkt neben PopTotal steht und die Gesamtbevölkerung des Landes anzeigt. Bei Afghanistan müssten dann immer 38928.341 stehen. Es gibt einfach keinen Eintrag in der Datei, die die Gesamtbevölkerung mit alleren Sturkturen abbildet.

Ich habe mir z.B. das hier angelegt:

f.head()

LocID
PopTotal
index


0
4
38928.341
1
8
2877.800
2
12
43851.043
3
24
32866.268
4
28
97.928


ich merke gerade, dass die Darstellung nicht hier hilfreich ist :-/
Gibt es hier eine Möglichkeit, aus dem Jupyter Notebook meinen Code vernünftig darzustellen?
Glaube, dass so schon mein Problem klarer wäre.

Viele Grüße
Karambit
Antworten