【发布时间】:2017-04-17 16:19:33
【问题描述】:
fillna 可以接受一个函数吗?或者只是方法'backfill','bfill'等?
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
例如,如果数据框没有任何初始数据,则回填方法将毫无用处,不是吗?反之亦然,以防数据帧末尾没有数据。
这就是为什么我想使用适当的方法(如外推法)的一些原因
【问题讨论】:
fillna 可以接受一个函数吗?或者只是方法'backfill','bfill'等?
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
例如,如果数据框没有任何初始数据,则回填方法将毫无用处,不是吗?反之亦然,以防数据帧末尾没有数据。
这就是为什么我想使用适当的方法(如外推法)的一些原因
【问题讨论】:
fillna 打算取一个value 来填充,或者使用*{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}* 中的一种方法
值:标量、字典、序列或数据帧
用于填充空洞的值(例如 0),或者指定用于每个索引(对于系列)或列(对于数据框)的值的 dict/Series/DataFrame。 (不在 dict/Series/DataFrame 中的值将不会被填充)。此值不能是列表。
回答
fillna 没有将函数作为value 参数的有效输入。但是,如果您有一个可以生成系列或数据帧的函数,那么您可以将所需的任何输入传递给函数并将结果传递给fillna
示例
value 参数可以采用标量、字典、系列或数据帧。以下是一些外观示例
考虑数据框df
df = pd.DataFrame([
[1, None, 2, None],
[None, 3, None, 4],
[5, 6, None, None],
[None, None, 7, 8]
], list('ABCD'), list('WXYZ'))
print(df)
W X Y Z
A 1.0 NaN 2.0 NaN
B NaN 3.0 NaN 4.0
C 5.0 6.0 NaN NaN
D NaN NaN 7.0 8.0
用标量填充
df.fillna(9)
W X Y Z
A 1.0 9.0 2.0 9.0
B 9.0 3.0 9.0 4.0
C 5.0 6.0 9.0 9.0
D 9.0 9.0 7.0 8.0
用字典填充
filler = dict(W=-9, X=-10, Y=-11, Z=-12)
df.fillna(filler)
W X Y Z
A 1.0 -10.0 2.0 -12.0
B -9.0 3.0 -11.0 4.0
C 5.0 6.0 -11.0 -12.0
D -9.0 -10.0 7.0 8.0
填写系列
filler = pd.Series(dict(W=-9, X=-10, Y=-11, Z=-12))
df.fillna(filler)
W X Y Z
A 1.0 -10.0 2.0 -12.0
B -9.0 3.0 -11.0 4.0
C 5.0 6.0 -11.0 -12.0
D -9.0 -10.0 7.0 8.0
用数据框填充
filler = pd.DataFrame(-np.arange(df.size).reshape(df.shape), df.index, df.columns)
print(filler)
W X Y Z
A 0 -1 -2 -3
B -4 -5 -6 -7
C -8 -9 -10 -11
D -12 -13 -14 -15
df.fillna(filler)
W X Y Z
A 1.0 -10.0 2.0 -12.0
B -9.0 3.0 -11.0 4.0
C 5.0 6.0 -11.0 -12.0
D -9.0 -10.0 7.0 8.0
用索引填充,需要转置df.fillna(filler, axis=1)生成NotImplementedError
filler = dict(A=-9, B=-10, C=-11, D=-12)
print(df.T.fillna(filler).T)
W X Y Z
A 1.0 -9.0 2.0 -9.0
B -10.0 3.0 -10.0 4.0
C 5.0 6.0 -11.0 -11.0
D -12.0 -12.0 7.0 8.0
【讨论】:
简答:
不,fillna 不能接受函数,只能接受方法。
简短的回答:
有一个df.interpolate 函数允许您使用不同的插值技术来填充。
长答案:
您可以参考the answer here,其中有人概述了一种使用 scipy 推断数据的方法。不幸的是,没有原生的 pandas 函数来实现这一点):
【讨论】: