我正在尝试使用以下所有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值进行计数,那么我可以运行一些计算来实现拆分。
答案 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'))