Mam kilka ramek danych pand, każda z nichkolumna ints w nich, i chciałbym utworzyć nową ramkę danych z sumą ich wartości w każdym indeksie. Ich indeksy będą miały kilka nakładających się wpisów, a te są niecenzuralne, których wartości chcę dodać razem. Jeśli indeks znajduje się tylko w jednej ramce danych, chcę, aby nowa ramka danych (lub seria) zawierała ten indeks i po prostu użyła tej jednej wartości jako jej wartości. Wydaje się to proste, ale nie mogę tego zrozumieć, a dokumentacja wydaje się koncentrować na łączeniu ramek danych bardziej niż łączeniu ich wartości. Zasadniczo, biorąc pod uwagę dwie ramki danych, które wyglądają tak:
>>> df1
0
a 3
b 7
d 2
>>> df2
0
c 11
d 19
I chciałbym, aby końcowe wyniki wyglądały tak:
>>> df3
0
a 3
b 7
c 11
d 21
Z góry dziękuję.
Odpowiedzi:
3 dla odpowiedzi № 1Najprostsza odpowiedź, jeśli dodajesz tylko dwie ramki danych:
# fill_value parameter specifies how to treat missing rows, since you can"t add NaN (i.e. add 0)
df3 = df1.add(df2, fill_value=0)
df3
Out[18]:
0
a 3
b 7
c 13
d 19
Jeśli jednak chcesz dodać więcej niż dwa, najprostszy i najszybszy sposób jest bardziej podobny do tego:
import pandas as pd
# initialize example inputs
df1 = pd.DataFrame([3, 7, 2], index=["a", "b", "c"])
df2 = pd.DataFrame([11, 19], index=["c", "d"])
df3 = pd.DataFrame([3, 7, 11, 21], index=["a", "b", "c", "d"])
# when concatenating with axis=1, columns are added side by side. Rows are matched with other rows having the same index.
aggregate_df = pd.concat([df1, df2, df3], axis=1)
# sum across columns (axis=1). Convert resulting Series to DataFrame
df4 = aggregate_df.sum(axis=1).to_frame()
df4
Out[11]:
0
a 6
b 14
c 24
d 40
dtype: float64