Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:如何在大型数据集中填充缺失的值?_Python_Pandas_Performance_Data Science - Fatal编程技术网

Python 熊猫:如何在大型数据集中填充缺失的值?

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.

我在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.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