两个独立的数据帧列表中所有元素的均值和标准差
Mean and standard deviation of all the elements in two independent lists of dataframes
我有两个列表,每个列表都有两个数据框。例如,lst1 = [df11, df12] 和 lst2 = [df21, df22]。我想计算两个列表 lst1 和 lst2 的相应元素的均值和标准差。即 lst3 = [mean(df11, df21), mean(df12, df22)]
和 lst4 = [std(df11, df21), std(df12, df22)]
.
下面给出对应的数据框,
df11 = pd.DataFrame(np.array([[99,85,93], [89,97,94], [80,95,89]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df21 = pd.DataFrame(np.array([[85,99,50], [97,89,75], [95,80,60]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df12 = pd.DataFrame(np.array([[99,85,93], [89,97,94], [80,95,89]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df22 = pd.DataFrame(np.array([[85,99,50], [97,89,75], [95,80,60]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
此外,lst1 = [df11, df12]
和 lst2 = [df21, df22]
。
在 python 中有没有一种简单的方法可以做到这一点?
编辑:假设 m1 = mean(df11, df21)
和 m2 = mean(df12, df22)
,则
m1 = and m2 =
此外,如果 s1 = std(df11, df21)
和 s2 = std(df12, df22)
,则
s1 = and s2 =
我得到了这个问题的答案。
根据给定的信息,
列表数量,NumberOfLists = 2
每个列表的数据帧数,NumberOfDfPerList = 2
for i in range(NumberOfDfPerList):
listofDf = [listOfDf[k][i] for k in range(NumberOfLists)]
stats = pd.concat(listofDf).groupby(level=0).agg(['mean','std']).swaplevel(0,1,axis=1).round(2).astype(str)
result = stats['mean'] + '±' + stats['std']
result_arr.append(result)
我注意到你自己得到了很好的答案
这是一个可能的选择
想法是使用内部 numpy 表示并使用 numpy concatenation/mean calcs
对于平均值:
import numpy as np
[pd.DataFrame(np.array([p1.values, p2.values]).mean(axis=0), columns = df11.columns, index = df11.index) for (p1,p2) in zip(lst1,lst2)]
生成包含两个 df 的列表:
[ Sensetivity specificity Accuracy
A 92.0 92.0 71.5
B 93.0 93.0 84.5
C 87.5 87.5 74.5,
Sensetivity specificity Accuracy
A 92.0 92.0 71.5
B 93.0 93.0 84.5
C 87.5 87.5 74.5]
与 std 类似,将上面命令中的 mean
替换为 std
。适用于任何长度的数组
我有两个列表,每个列表都有两个数据框。例如,lst1 = [df11, df12] 和 lst2 = [df21, df22]。我想计算两个列表 lst1 和 lst2 的相应元素的均值和标准差。即 lst3 = [mean(df11, df21), mean(df12, df22)]
和 lst4 = [std(df11, df21), std(df12, df22)]
.
下面给出对应的数据框,
df11 = pd.DataFrame(np.array([[99,85,93], [89,97,94], [80,95,89]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df21 = pd.DataFrame(np.array([[85,99,50], [97,89,75], [95,80,60]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df12 = pd.DataFrame(np.array([[99,85,93], [89,97,94], [80,95,89]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
df22 = pd.DataFrame(np.array([[85,99,50], [97,89,75], [95,80,60]]), index=["A", "B", "C"], columns = ["Sensetivity", "specificity", "Accuracy"])
此外,lst1 = [df11, df12]
和 lst2 = [df21, df22]
。
在 python 中有没有一种简单的方法可以做到这一点?
编辑:假设 m1 = mean(df11, df21)
和 m2 = mean(df12, df22)
,则
m1 =
此外,如果 s1 = std(df11, df21)
和 s2 = std(df12, df22)
,则
s1 =
我得到了这个问题的答案。
根据给定的信息,
列表数量,NumberOfLists = 2
每个列表的数据帧数,NumberOfDfPerList = 2
for i in range(NumberOfDfPerList):
listofDf = [listOfDf[k][i] for k in range(NumberOfLists)]
stats = pd.concat(listofDf).groupby(level=0).agg(['mean','std']).swaplevel(0,1,axis=1).round(2).astype(str)
result = stats['mean'] + '±' + stats['std']
result_arr.append(result)
我注意到你自己得到了很好的答案
这是一个可能的选择
想法是使用内部 numpy 表示并使用 numpy concatenation/mean calcs
对于平均值:
import numpy as np
[pd.DataFrame(np.array([p1.values, p2.values]).mean(axis=0), columns = df11.columns, index = df11.index) for (p1,p2) in zip(lst1,lst2)]
生成包含两个 df 的列表:
[ Sensetivity specificity Accuracy
A 92.0 92.0 71.5
B 93.0 93.0 84.5
C 87.5 87.5 74.5,
Sensetivity specificity Accuracy
A 92.0 92.0 71.5
B 93.0 93.0 84.5
C 87.5 87.5 74.5]
与 std 类似,将上面命令中的 mean
替换为 std
。适用于任何长度的数组