如何根据"pandas.DataFrame.index"计算两个"pandas.DataF



我想要实现的目标

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

预期的结果是一个数据帧,其值如下所示。

  • 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)

数据帧与您的输出匹配,但可能需要修复数据类型你可以使用

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

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

如果不与numpy一起使用,请在代码中仅使用int而不是np.int64

有关此方面的文档,请参阅Pandas文档

您要查找的是df.combine方法这种方法将两个数据帧与给定的函数结合在一起,就像文档显示一样

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)

这比添加提供了更多的灵活性

试用groupby

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

这里有一种使用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

最新更新