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 № 1Da ist dein Problem MultiIndex
nicht zusammengebracht, also erhalten Sie NaN
s. 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