我有两只同样长和宽的熊猫数据。我想要找到两个数据的每个单元之间的%CV (或者标准的dev和平均值,然后我可以手工计算CV )。
例如,如果我有这样的东西:
A B C
0 1 2 3
1 4 5 6
2 7 8 9 和
A B C
0 3 2 1
1 6 5 4
2 9 8 7我想返回一个数据,其中包含第一个数据中的A1和第二个数据中的A1之间的标准差/平均值/CV。
例(平均数):
A B C
0 2 2 2
1 5 5 5
2 8 8 8我想要相同的标准差,然后通过标准偏差/平均值计算%CV。
我已经尝试将数据格式转换为numpy。
stan_dev = np.dstack((arr1.to_numpy(), arr2.to_numpy())).std(axis=2)但我知道这个错误:
TypeError: loop of ufunc does not support argument 0 of type float which has no callable sqrt method谢谢!
发布于 2022-06-20 20:02:39
您可以使用pandas或numpy来完成这一任务。然而,我对你希望根据2个数据点的标准偏差/变异系数推断出的情况持谨慎态度。
有了这个警告,你会注意到下面的两个答案有一个相似的结构-
将数据集组合成一个通用的container
。
NumPy方法
stack将datasetsaxis=0相结合,允许在最低的dimensionDataFrameimport numpy as np
import pandas as pd
arr = np.stack((df1, df2))
cv_arr = arr.std(axis=0, ddof=1) / arr.mean(axis=0)
out = pd.DataFrame(data=cv_arr, columns=df1.columns, index=df1.index)
print(out)
A B C
0 0.707107 0.0 0.707107
1 0.282843 0.0 0.282843
2 0.176777 0.0 0.176777纯熊猫法
pd.concat组合数据集并指定keys参数以获得使用MultiIndex表示高于2d.swaplevels操作以更好地利用索引alignment.pipe计算变异系数import pandas as pd
out = (
pd.concat([df1, df2], keys=[0, 1])
.groupby(level=1)
.agg(['mean', 'std'])
.swaplevel(axis=1)
.pipe(lambda df_: df_['std'] / df_['mean'])
)
print(out)
A B C
0 0.707107 0.0 0.707107
1 0.282843 0.0 0.282843
2 0.176777 0.0 0.176777我个人推荐numpy解决方案,因为这些数据和分析用3d数组比分层DataFrame更好地表示。
https://stackoverflow.com/questions/72692151
复制相似问题