如何在熊猫中的 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
的第一级MultiIndex
和sum
,通过Series.isna
和sum
检查缺失值来获得第二个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 值之间平均重新分配值?的主要内容,如果未能解决你的问题,请参考以下文章