Python 跨多个数据帧的加权平均

Python 跨多个数据帧的加权平均,python,pandas,dataframe,Python,Pandas,Dataframe,我有几个相同维度的数据帧,比如说df1和df2 我想创建第三个数据帧,比如avg_df,它是df1和df2中各自值的加权平均值。假设我想用因子2加权df1,用因子1加权df2 我还有另一个问题,在某些列中填充了字符串(但在数据帧中是相同的)。但我需要在平均时忽略这些 一些示例代码: df1 = pd.DataFrame([["hello", 2, 1], ["hello", 1, 1]], columns=["a", "b&q

我有几个相同维度的数据帧,比如说df1和df2

我想创建第三个数据帧,比如avg_df,它是df1和df2中各自值的加权平均值。假设我想用因子2加权df1,用因子1加权df2

我还有另一个问题,在某些列中填充了字符串(但在数据帧中是相同的)。但我需要在平均时忽略这些

一些示例代码:

df1 = pd.DataFrame([["hello", 2, 1], ["hello", 1, 1]], columns=["a", "b", "c"])
df2 = pd.DataFrame([["hello", 2, 2], ["hello", 1, 1]], columns=["a", "b", "c"])
手动键入结果可能是这样的(显然不是可行的解决方案,只是为了有示例代码生成所需的输出):

我怎么去那里


谢谢

一种方法,如果你想根据每行的索引得到平均值。您可以通过联系这两个数据帧并获取该数据帧的平均值来实现这一点

In [10]: df_concat = pd.concat((df1,df2))                                                                                                                                                                   

In [11]: df_concat                                                                                                                                                                                          
Out[11]: 
       a  b  c
0  hello  2  1
1  hello  1  1
0  hello  2  2
1  hello  1  1

In [12]: by_row_index = df_concat.groupby(df_concat.index)                                                                                                                                                  

In [13]: df_mean = by_row_index.mean()        

In [15]: df_mean                                                                                                                                                                                            
Out[15]: 
     b    c
0  2.0  1.5
1  1.0  1.0

In [18]: result = pd.concat([df_mean,df1[["a"]]],axis=1)                                                                                                                                                    

In [19]: result                                                                                                                                                                                             
Out[19]: 
     b    c      a
0  2.0  1.5  hello
1  1.0  1.0  hello

如果确实要忽略字符串列,并且确定两个
df
的形状相同,则可以执行以下操作:

sel = ['b', 'c']  # numeric columns
df3 = df1.copy()
df3[sel] = 2/3 * df1[sel] + 1/3 * df2[sel]
在您的数据中,
df3
是:

       a    b         c
0  hello  2.0  1.333333
1  hello  1.0  1.000000
但是,在更一般的情况下,您可能有不同的大小,并且您的
a
列可能是相关的。以下是一个例子:

df1 = pd.DataFrame([["hello", 2, 1], ["world", 1, 1]], columns=["a", "b", "c"])
df2 = pd.DataFrame([["world", 2, 2], ["hello", 1, 1]], columns=["a", "b", "c"])

(2/3 * df1.set_index('a').stack() +
 1/3 * df1.set_index('a').stack()).groupby(level=[0,1]).mean().unstack().reset_index()

# gives:
       a    b    c
0  hello  2.0  1.0
1  world  1.0  1.0

请不要粘贴文字图像;只要文本就可以了。关于您的问题:为什么预期结果中有两行?如果
a
列包含多个不同的字符串怎么办?在我的情况下,这不会发生。所以在我的例子中,你可以选择任意一个字符串。这已经很有用了,谢谢!但这个平均值并不像我需要的那样加权。有可能得到平均值并声明一些权重吗?这正是我想要的,简单又好。非常感谢。快速提示:在您的示例代码中,它应该是1/3*df2[sel]!
df1 = pd.DataFrame([["hello", 2, 1], ["world", 1, 1]], columns=["a", "b", "c"])
df2 = pd.DataFrame([["world", 2, 2], ["hello", 1, 1]], columns=["a", "b", "c"])

(2/3 * df1.set_index('a').stack() +
 1/3 * df1.set_index('a').stack()).groupby(level=[0,1]).mean().unstack().reset_index()

# gives:
       a    b    c
0  hello  2.0  1.0
1  world  1.0  1.0