Python 熊猫:如何在大型数据集中填充缺失的值?
我在Pandas中有一个很大的数据集(大约800万行x 25列),我正在努力以一种高效的方式完成一个操作 以下是我的数据集的外观:Python 熊猫:如何在大型数据集中填充缺失的值?,python,pandas,performance,data-science,Python,Pandas,Performance,Data Science,我在Pandas中有一个很大的数据集(大约800万行x 25列),我正在努力以一种高效的方式完成一个操作 以下是我的数据集的外观: temp size location_id hours 135 78 12.0 100.0 79 NaN NaN 80 NaN NaN 81 15.0 112.
temp size
location_id hours
135 78 12.0 100.0
79 NaN NaN
80 NaN NaN
81 15.0 112.0
82 NaN NaN
83 NaN NaN
84 14.0 22.0
- 我在[location\u id,hours]上有一个多索引。我有大约60k个位置,每个位置140个小时(构成800万行)
- 其余数据为数字(浮点)。我在这里只包括了2个专栏,通常大约有20个专栏
- 我愿意做的是使用它周围的值来填充那些
值。基本上,小时NaN
的值将从79
和78
的值中导出。对于本例,81
的79
值将为temp
(基本外推)13.0
- 我一直知道,只有
小时将被填满,其余的将有78、81、84(3的倍数)
。永远都是这样。在NaN
之间的数小时内,这是正确的78-120
- 考虑到这些,我在Pandas中实现了以下算法:
df_相关_数据=df.loc[(df.index.get_level_values(1)>=78)&(df.index.get_level_values(1)我相信您正在寻找:
你试过玩吗,比如在df.interpolate()
?@HenryYik你是一个救生员。使用interpolate()
,整个数据存储只花了不到20秒。非常感谢。你能将此作为答案发布,以便我可以接受吗?当然,答案已添加。
df_relevant_data = df.loc[(df.index.get_level_values(1) >= 78) & (df.index.get_level_values(1) <= 120), :]
for location_id, data_of_location_id in df_relevant_data.groupby("location_id"):
for hour in range(81, 123, 3):
top_hour_data = data_of_location_id.loc[(location_id, hour), ['temp', 'size']] # e.g. 81
bottom_hour_data = data_of_location_id.loc[(location_id, (hour - 3)), ['temp', 'size']] # e.g. 78
difference = top_hour_data.values - bottom_hour_data.values
bottom_bump = difference * (1/3) # amount to add to calculate the 79th hour
top_bump = difference * (2/3) # amount to add to calculate the 80th hour
df.loc[(location_id, (hour - 2)), ['temp', 'size']] = bottom_hour_data.values + bottom_bump
df.loc[(location_id, (hour - 1)), ['temp', 'size']] = bottom_hour_data.values + top_bump
print (df.interpolate())
temp size
location_id hours
135 78 12.000000 100.0
79 13.000000 104.0
80 14.000000 108.0
81 15.000000 112.0
82 14.666667 82.0
83 14.333333 52.0
84 14.000000 22.0