如何在熊猫中的 NaN 值之间平均重新分配值?

Posted

技术标签:

【中文标题】如何在熊猫中的 NaN 值之间平均重新分配值?【英文标题】:How to redistribude the the value equaly between NaN values in pandas? 【发布时间】:2019-08-01 11:17:51 【问题描述】:

我有以下数据框:

                'B'         'C'
1/1/2017    'A' 
            BTC NaN       0.367392
            ETH NaN       0.367392
            XRP 0.164735  0.164735
            LTC 0.100481  0.100481
1/2/2017    BTC NaN       0.315265
            XRP NaN       0.315265
            ETH NaN       0.315265
            LTC 0.054204  0.054204

我想在 NaN 值之间平均重新分配 (1 - df['B'].groupby(level=0).sum())。 “C”列是预期输出的示例。

【问题讨论】:

什么是公式?我得到了一些不同的输出。 @jezrael 抱歉,我给出了一个错误的公式示例。我需要 (1 - df['B'].groupby(level=0).sum()) 谢谢。很抱歉造成混乱。 【参考方案1】:

应该这样做。您可以从here 和 onisnull()here 获取有关如何计算非 nan 值的更多信息。

无论您使用什么答案,始终抓住列没有 NaN 值的情况。在这种情况下,两个答案都会导致除以零错误。

import pandas as pd
import numpy as np
test = [np.NAN,np.NAN,np.NAN,np.NAN,0.123128,0.1238123]
df = pd.DataFrame("B":test)
df["C"] = df["B"].copy()
df["C"][df["C"].isnull()] = (1-df["B"].dropna().sum())/(len(df["B"]) - df["B"].count())
print(df)

输出:

          B         C
0       NaN  0.188265
1       NaN  0.188265
2       NaN  0.188265
3       NaN  0.188265
4  0.123128  0.123128
5  0.123812  0.123812

【讨论】:

【参考方案2】:

您可以使用GroupBy.transform 的第一级MultiIndexsum,通过Series.isnasum 检查缺失值来获得第二个NaN 计数,除以和替换缺失值:

print (df)
                     C         D
A        B                      
1/1/2017 BTC       NaN  0.367392
         ETH       NaN  0.367392
         XRP  0.164735  0.164735
         LTC  0.100481  0.100481
1/2/2017 BTC       NaN  0.315265
         XRP       NaN  0.315265
         ETH       NaN  0.315265
         LTC  0.054204  0.054204

sum1 = 1 - df['C'].groupby(level=0).transform('sum')
len1 = df['C'].isna().groupby(level=0).transform('sum')

df['E'] = df['C'].fillna(sum1 / len1)
print (df)
                     C         D         E
A        B                                
1/1/2017 BTC       NaN  0.367392  0.367392
         ETH       NaN  0.367392  0.367392
         XRP  0.164735  0.164735  0.164735
         LTC  0.100481  0.100481  0.100481
1/2/2017 BTC       NaN  0.315265  0.315265
         XRP       NaN  0.315265  0.315265
         ETH       NaN  0.315265  0.315265
         LTC  0.054204  0.054204  0.054204

【讨论】:

非常感谢您的解决方案!完美运行!

以上是关于如何在熊猫中的 NaN 值之间平均重新分配值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中用 NaN 替换浮点值?

熊猫:在每组中按平均值填充缺失值

熊猫:在每组中按平均值填充缺失值

如何重新索引熊猫数据框以将起始索引值重置为零? [重复]

如何对熊猫表中的值进行平均

如何用熊猫(python)中的其他值替换NAN [重复]