【问题标题】:Possible optimization of going through pandas dataframe通过 pandas 数据框的可能优化
【发布时间】:2018-08-09 21:17:00
【问题描述】:

我正在尝试找到一种方法来优化循环通过 pandas 数据框。该数据集包含约 45 万行和约 20 列。数据框包含 3 个位置变量作为多索引,我想删除组中存在 NaN 列的行,否则用组的平均值填充 NaN。

LOC = ['market_id', 'midmarket_id', 'submarket_id']

# Assign -1000 to multiindex nan values
df = df.fillna({c:-1000 for c in LOC})
df = df.set_index(LOC).sort_index(level=[i for i in range(len(LOC))])

# Looping through subset with same (market, midmarket, submarket)
for k, v in df.copy().groupby(level=[i for i in range(len(LOC))]):

    # If there is any column with all NaN value, drop it from df
    if v.isnull().all().any():
        df.drop(v.index.values)

    # If there is at least one non-NaN value, fillna with mean
    else:
        df.loc[v.index.values] = df.loc[v.index.values].fillna(v.mean())

所以如果有这样的数据框 before 它应该像这样转换,删除所有 NaN 列的行 after.

如果这是多余的或不符合堆栈溢出问题指南,我深表歉意。但如果有人对此有更好的解决方案,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    无需复制整个数据框。也不需要手动迭代GroupBy 元素。这是一个替代解决方案:

    LOC = ['market_id', 'midmarket_id', 'submarket_id']
    
    # Assign -1000 to NaN values
    df = df.fillna(-1000)
    
    # Include only columns containing non-nulls
    non_nulls = np.where(df.notnull().any())[0]
    df = df.iloc[:, non_nulls]
    
    # Fill columns with respective groupwise means
    g = df.groupby(LOC)
    
    for col in df.columns.difference(LOC):
        df[col] = df[col].fillna(g[col].transform('mean'))
    

    【讨论】:

    • 似乎第 3-7 行并没有真正做任何事情。第 3 行的所有 NaN 都填充了 -1000,因此之后没有任何事情发生。但是,我应用了代码的最后两行替换了 for 循环并解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2018-11-21
    • 2015-07-25
    • 2016-06-06
    • 2022-06-18
    相关资源
    最近更新 更多