【问题标题】:How can I transform my DataFrame to normal distribution?如何将我的 DataFrame 转换为正态分布?
【发布时间】:2020-10-16 15:08:23
【问题描述】:

我有一个这样的数据框。

my_df = pd.DataFrame({'A' : [0.1,0.15,0.22,0.2], 'B' : [0.9,0.85,0.78,0.8]})
my_df
# normality test
stat, p = shapiro(my_df)
print('Statistics=%.3f, p=%.3f' % (stat, p))

夏皮罗检验表明数据不是高斯分布。

如何更改我的数据框,以便它获得两个新列(即现有两列的四个特征)以及遵循正态/高斯分布的新值?

【问题讨论】:

  • 你能根据样本输入分享预期的输出吗?
  • 我不太明白。新输出应该是为 A 列和 B 列中的现有值计算的新值。
  • 新列应该如何连接到非正常的现有列?
  • 这是我不知道的。我想可以通过某些函数来获得标准化值。
  • 为什么不简单地生成新的常态?

标签: python pandas numpy dataframe


【解决方案1】:

数据的标准化是通过boxcox 转换完成的,所以你可以这样做:

from scipy.stats import boxcox, shapiro
my_df = pd.DataFrame({'A' : [0.1,0.15,0.22,0.2], 'B' : [0.9,0.85,0.78,0.8]})
df_norm = my_df.apply(lambda x: boxcox(x)[0])
print(df_norm)
          A         B
0 -0.660612 -0.134124
1 -0.641490 -0.237600
2 -0.609405 -0.451641
3 -0.619138 -0.379958

【讨论】:

  • 谢谢。这些值也可以是正数吗?
  • 在我的原始数据框中,使用建议的 boxcox 函数对其进行标准化后,p 值仍为 0。我能做什么?
  • 显示您的完整数据
  • 对我来说,它与 PowerTransformer(method='yeo-johnson', standardize=True) 一起使用
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2010-09-09
  • 2016-07-29
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多