【问题标题】:How to filter a dataframe efficient when I have to compare values of two columns?当我必须比较两列的值时如何有效地过滤数据框?
【发布时间】:2020-10-12 09:52:23
【问题描述】:

目前我正在处理一个项目并遇到了一些效率问题。在某些时候,我有一个巨大的数据框,需要删除行。我的数据框包含两列,其值为“0”、“1”或其他 np.nan。

我需要删除第一列为“0”而另一列为“1”的所有行,反之亦然。我想保留所有其他组合。

我编写了一个可以完成这项工作的函数,但它的效率非常低并且需要很长时间。这是输入、我的功能和预期输出的示例。

data = {'val': ['a', 'b', 'c'],
         'compare1': ['0', '0', '1'],
        'compare2': ['0', None,  '0']
        }

df = pd.DataFrame (data)
df

>       val     compare1    compare2
>  0    a       0           0
>  1    b       0           None
>  2    c       1           0

我的功能:

def filter_df(df, colname1, colname2):
    for index, row in df.iterrows():
        if (row[colname1] == "0") and (row[colname2] == "1"):
            df.drop(index, inplace=True)
        if (row[colname1] == "1") and (row[colname2] == "0"):
            df.drop(index, inplace=True)
    return df

我想通过 fkt 获得的输出:

df_new = filter_df(df,'compare1', 'compare2')
df_new

>       val     compare1    compare2
>  0    a       0           0
>  1    b       0           None

如果您有使其更高效的想法,请告诉我 :-)。我很高兴得到各种帮助。

最好的选择

【问题讨论】:

    标签: python pandas performance dataframe filter


    【解决方案1】:

    你可以使用这样的条件:

    mask1 = ~((df['compare1'] == "0") & (df['compare2'] == "1")) 
    mask2 = ~((df['compare1'] == "1") & (df['compare2'] == "0"))
    df = df[mask1 & mask2 ]
    

    如果性能对你来说仍然没有效率,我建议你转向 numpy 以获得更好的性能......

    【讨论】:

      【解决方案2】:

      您可以将数据框转换为数字类型:

      df = df.transform(pd.to_numeric, errors="ignore")
      df
      
      
        val   compare1    compare2
      0   a      0        0.0
      1   b      0        NaN
      2   c      1        0.0
      

      然后过滤 compare 列的总和等于 1 :

      df.loc[~df.compare1.add(df.compare2).eq(1)]
      
      
         val  compare1    compare2
      0   a       0       0.0
      1   b       0       NaN
      

      【讨论】:

        猜你喜欢
        • 2020-06-08
        • 2022-11-17
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多