簡體   English   中英

如何根據`pandas.DataFrame.index`計算兩個`pandas.DataFrame`的總和?

[英]How can I calculate the sum of two `pandas.DataFrame` based on `pandas.DataFrame.index`?

我想要達到的目標

import pandas as pd

data = [[1, 2], [3, 4]]
index1 = ['I1', 'I2']
index2 = ['I1', 'I3']
columns = ['C1', 'C2']

df1 = pd.DataFrame(data, index=index1, columns=columns)
df2 = pd.DataFrame(data, index=index2, columns=columns)

print(df1)
#    C1  C2
#I1   1   2
#I2   3   4

print(df2)
#    C1  C2
#I1   1   2
#I3   3   4

print(...) # Calculate somehow
## !!!!!Expected Result!!!!!
#    C1  C2
#I1   2   4
#I2   3   4
#I3   3   4

預期結果是 dataframe,其值如下所示。

  • I1:兩個數據幀的總和,因為df1df2都有一個名為'I1'的行。
  • I2:使用df1.loc['I2']的值,因為df2沒有這個索引。
  • I3:使用df2.loc['I3']的值,因為df1沒有這個索引。

我測試的

print(df1.add(df2, axis='index'))
#    C1  C2
#I1 2.0 4.0
#I2 NaN NaN
#I3 NaN NaN

print(pd.concat([df1, df2]))
#    C1  C2
#I1   1   2
#I2   3   4
#I1   1   2
#I3   3   4

print(df1 + df2.values)
#    C1  C2
#I1   2   4
#I2   6   8

你能幫我得到預期的結果嗎?

嘗試使用DataFrame.add()

df = df1.add(df2, fill_value=0)

dataframe 與您的 output 匹配,但可能需要修復您可以使用的 dtypes

df["C1"] = df["C1"].astype(np.int64)
 
df["C2"] = df["C2"].astype(np.int64)

對於不與 numpy 一起使用,在代碼中只使用int而不是np.int64

有關此文檔,請參閱Pandas 文檔

嘗試使用groupby進行鏈式連接

out = pd.concat([df1, df2]).groupby(level=0).sum()
Out[161]: 
    C1  C2
I1   2   4
I2   3   4
I3   3   4

您正在尋找的是 df.combine 方法此方法將您的兩個數據幀與給定的 function 組合在一起,就像文檔顯示

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.combine.html

所以基本上你需要做的是以下,

func = lambda s1,s2: s1+s2
df3 = df1.combine(df2,func,fill_value=0)
print(df3)

這為您提供了比添加更多的靈活性

這是使用 combine_first 的一種方法,依次

df3=df3.combine_first(df1).combine_first(df2)
df3

     C1      C2
I1  2.0     4.0
I2  3.0     4.0
I3  3.0     4.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM