【问题标题】:Quick ways to fill the missing values of a pandas dataframe with complicated rules使用复杂规则填充熊猫数据框缺失值的快速方法
【发布时间】:2017-05-30 21:55:36
【问题描述】:

在 m*(n+1) 的 pandas 数据框 data_df 中,有一个 timestamp 列,其值可能是 range(0,p) 中的重复整数(表示时间;总共有 p 个唯一值)并且没有缺失值。还有其他列data_1data_2data_3、...data_n,每列都有一些缺失值。

我想使用与该行的timestamp 值相关的特定数字来填充数据列的每一行中的缺失值。因此,我得到了一个 p*n pandas 数据框median_tablemedian_table的第i行的值用于填充data_df中的缺失值,timestamp为i。

但是,我想不出一种快速且便于记忆的方法来执行此操作。目前,我使用以下代码(median_tabledata_df 已经定义):

new_data_df = pd.DataFrame()
for _timestamp in median_table.timestamp:
    temp_df = data_df.loc[data_df.timestamp == _timestamp]
    temp_df.fillna(median_table.loc[_timestamp, :], inplace=True)
    new_data_df = new_data_df.append(temp_df)

这是非常低效的。另一种算法:

for _timestamp in median_table.timestamp:
    data_df.loc[data_df.timestamp == _timestamp] = \
        data_df.loc[data_df.timestamp == _timestamp]\
            .fillna(median_table.loc[_timestamp, :], inplace=False)

对我来说工作同样缓慢。

有没有更快的方法来做同样的事情?

【问题讨论】:

    标签: python algorithm pandas dataframe variable-assignment


    【解决方案1】:

    尝试这种方法:识别 data_df 中的 NaN,并将它们与您的 median_table 合并。我希望这比 for 循环更快。抱歉,如果我错误地假设了您的数据结构,但这至少可以让您开始:

    import pandas as pd
    import numpy as np
    
    # Create dummy dataframe
    data_df = pd.DataFrame({
        "timestamp": [1, 2, 3, 4],
        "data": [1, 2, np.nan, np.nan]
        })
    print data_df
    """
    Dataframe looks like:
    data  timestamp
     1.0          1
     2.0          2
     NaN          3
     NaN          4
    """
    
    # Create dummy median table
    median_table = pd.DataFrame({
        "timestamp": [1, 2, 3, 4],
        "missing_data": [100, 200, 300, 400]
        })
    print median_table
    """
    Median table looks like:
    missing_data  timestamp
        100          1
        200          2
        300          3
        400          4
    """
    
    # Find NaNs in "data" column in data_df
    nan_indexes = data_df["data"].isnull()
    nan_df = data_df[nan_indexes]
    print nan_df
    """
    nan_df looks like:
    data  timestamp
     NaN          3
     NaN          4
    """
    
    # Merge nan_df with median_table based on timestamp column
    new_df = pd.merge(left=nan_df, right=median_table, on="timestamp", how="left")
    print new_df
    """
    new_df looks like:
    data  timestamp  missing_data
     NaN          3           300
     NaN          4           400
    """
    
    # Clean up new_df
    new_df = new_df[["timestamp", "missing_data"]]  # Discard "data" column
    new_df.columns = ["timestamp", "data"]  # Rename "missing_data" column to "data"
    print new_df
    """
    new_df now looks like:
    timestamp  data
     3   300
     4   400
    """
    

    【讨论】:

    • 谢谢!但是,我刚刚意识到使用DataFrame.groupby() 方法而不是一开始就创建一个新的中值表可能非常有效。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2019-11-02
    • 2019-08-01
    相关资源
    最近更新 更多