我有一个同时包含时间序列和横截面数据的数据集。 有一些缺失的列,我想通过线性插值来处理。
我尝试了这个代码,但是出现了一个警告错误。 代码仍然有效,但我只是担心它可能会在一段时间后失效。 有没有更好的方法来做这个过程?
for i in merged_df.country_code.unique():
merged_df[merged_df.country_code == i].interpolate(inplace=True)
下面的错误代码:
C:\programData\anaconda3\lib\site-packages\ipykernel_launcher.py:2:settingWithCopyWarning:试图在数据帧中的片的副本上设置值
请参阅文档中的警告:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
正如文档中指出的,merged_df[merged_df.country_code==i]
是merged_df
的一部分。 一旦你尝试用一些原地操作链接起来,pandas就不能保证这些操作在原始数据框架或它的副本上工作。 使用loc
进行复制和重新分配更安全:
for i in merged_df.country_code.unique():
mask = merged_df.country_code == i
merged_df.loc[mask] = merged_df.loc[mask].interpolate()
IMHO,这就是inplace=true
不是一个好实践的原因之一。
也就是说,在本例中,您可以使用groupby
绕过for
循环:
merge_df = merge_df.groupby('country_code').interpolate()
或者:
merge_df = merge_df.groupby('country_code').apply(lambda x: x.interpolate())
问题是,pandas不能保证您将新数据分配给的对象是临时对象还是正确对象。 虽然它可能会起作用,但你最好使用
merged_df.loc[merged_df["country_code"]==i,0].interpolate(inplace=True)
因为这样可以保证您使用正确的对象。