熊猫用第一个可用值的一部分填充nan值

时间:2019-06-25 11:43:07

标签: python pandas dataframe

我正在尝试使用以下所有nan值中的第一个先前的可用值来替换DataFrame中的nan值。

在下面的示例中:

import pandas as pd
df = [100, None, None, 40, None, 120]
df = pd.DataFrame(df)

我想得到:

[33.33, 33.33, 33.33, 20, 20, 120]

如果我可以找到一种方法来对列中每个值之后的nan值进行计数,那么我可以运行一些计算来实现拆分。

2 个答案:

答案 0 :(得分:5)

使用:

import pandas as pd
df = [100, None, None, 40, None, 120]
df = pd.DataFrame(df, columns=['a'])

s = df['a'].ffill() / df.groupby(df['a'].notna().cumsum())['a'].transform('size')
print (s)

0     33.333333
1     33.333333
2     33.333333
3     20.000000
4     20.000000
5    120.000000
Name: a, dtype: float64

详细信息

您可以用NaN之前的非ffill值替换缺失值:

print (df['a'].ffill())
0    100.0
1    100.0
2    100.0
3     40.0
4     40.0
5    120.0
Name: a, dtype: float64

然后按Series.notna进行比较,并按Series.cumsum创建组:

print (df['a'].notna().cumsum())
0    1
1    1
2    1
3    2
4    2
5    3
Name: a, dtype: int32

并以与GroupBy.transform相同的大小获得每个组的计数:

print (df.groupby(df['a'].notna().cumsum())['a'].transform('size'))
0    3
1    3
2    3
3    2
4    2
5    1
Name: a, dtype: int64

答案 1 :(得分:0)

也许使用ffill,得到第一列,然后除以它(ffill的数据帧)groupby,然后使用transform('count')来获得计数并保持数据框的长度相同:

print(df.ffill()[0] / df.ffill().groupby(0)[0].transform('count'))