簡體   English   中英

Pandas用第一個可用值的分割填充nan值

[英]Pandas fill nan values with a split of the first available value

我正在嘗試將所有以下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值的數量,那么我可以運行一些計算來實現拆分。

使用:

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

細節

您可以通過ffill替換以前的非NaN值的缺失值:

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

也許使用ffill ,得到第一列,然后將它除以它( ffill ed ffillgroupby ed並使用transform('count')來獲取計數並保持數據幀的相同長度:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM