python - 对哪些行进行平均取决于条件的 pandas 数据帧的平均列表
问题描述
让我们dfList = [df0, df1, df2, df3, df4]
列出具有相同列和索引的熊猫数据框。
我想对它们进行平均,但某些数据框是某些行的异常值。
我有一个非异常值列表:myList = [ [0,1] , [1,2,3], [0,2,4] ]
显示应该为每一行平均哪些数据帧。
所以,
result.iloc[0,:] = average( df0.iloc[0,:] , df1[0,:] )
result.iloc[1,:] = average( df1.iloc[1,:] , df2.iloc[1,:] , df3.iloc[1,:] )
result.iloc[2,:] = average( df0.iloc[2,:] , df2.iloc[2,:] , df4.iloc[2,:] )
如何根据dfList
和计算上述平均值myList
?
解决方案
这基本上尖叫矩阵乘法!这应该适用于您的情况:
import pandas as pd, numpy as np
df1 = pd.DataFrame([[0,1,2],[1,2,4],[1,1,1],[1,1,1]])
df2 = pd.DataFrame([[10,10,10],[1,2,4],[1,1,1],[0,0,0]])
df3 = pd.DataFrame([[1,1,1],[1,2,4],[1,1,1],[0,0,0]])
df_list = [df1,df2,df3]
arr = np.stack(df_list)
print(arr)
lst = [[0,1],[1,2],[0,1,2],[0]]
_max = len(df_list)
mult = []
for _ in lst:
_lst = []
for i in range(_max):
if i in _:
_lst.append(1)
else:
_lst.append(0)
mult.append(_lst)
mult = np.array(mult)
print(mult)
mult = (mult.T/np.sum(mult,axis=1)).T
print(mult)
result = np.einsum('jik,ij->ik',arr,mult)
print(result)