/ / Pandas: Hinzufügen einer Spalte über Arithmetik für alle übereinstimmenden Indizes - Python, Pandas, DataFrame

Pandas: Hinzufügen von Spalten über Arithmetik zu allen übereinstimmenden Indizes - Python, Pandas, Dataframe

Bearbeiten: Es wurde eine Zeile ohne übereinstimmenden Index hinzugefügt, um das erwartete Verhalten zu demonstrieren

Ich habe die folgenden zwei Datenrahmen:

requests:

                requests
asn pop country
1   1   us      100
br      50
2   br      200
3   hk      150
4   uk      100
2   1   us      300
...

traffic:

        total capacity
asn pop
1   1   53    1000
2   15    1000
3   103   10000
2   1   254   10000
...

Ich möchte eine neue Spalte hinzufügen requests DataFrame mit einem Wert von traffic["total"] / traffic["capacity"], ausgerichtet auf die beiden übereinstimmenden Indizes.

Ich habe Folgendes versucht:

>>>requests["network"] = traffic["total"] / traffic["capacity"]
>>>requests
requests network
asn pop country
1   1   us      100      NaN
br      50       NaN
2   br      200      NaN
3   hk      150      NaN
4   uk      100      NaN
2   1   us      300      NaN
...

Wann alle drei Indizes sind vorhanden, das hat bei mir schon mal geklappt. In diesem Fall habe ich jedoch nur zwei Indizes, so dass es zu scheitern scheint.

Erwartete Ausgabe

>>>requests
requests network
asn pop country
1   1   us      100      0.053
br      50       0.053
2   br      200      0.015
3   hk      150      0.0103
4   uk      100      NaN
2   1   us      300      0.0254
...

Antworten:

3 für die Antwort № 1

Da ist dein Problem MultiIndex nicht zusammengebracht, also erhalten Sie NaNs. Lösung ist hinzufügen reindex.

requests["network"] =  traffic["total"].div(traffic["capacity"])
.reindex(requests.index, method="ffill")
print (requests)
requests  network
asn pop country
1   1   us            100   0.0530
br             50   0.0530
2   br            200   0.0150
3   hk            150   0.0103
2   1   us            300   0.0254

Alte Lösung mit reset_index + set_index:

requests = requests.reset_index(level=2)
requests["network"] =  traffic["total"].div(traffic["capacity"])
requests = requests.set_index("country", append=True)
print (requests)
requests  network
asn pop country
1   1   us            100   0.0530
br             50   0.0530
2   br            200   0.0150
3   hk            150   0.0103
2   1   us            300   0.0254

1 für die Antwort № 2

Sie können dies versuchen ..

requestes=requestes.reset_index().set_index(["asn","pop"])
requestes["network"]=traffic["total"] / traffic["capacity"]
requestes.reset_index().set_index(["asn","pop","country"])
Out[140]:
requests  network
asn pop country
1   1   us            100   0.0530
br             50   0.0530
2   br            200   0.0150
3   hk            150   0.0103
2   1   us            300   0.0254