【问题标题】:Exclude columns from pandas where()从 pandas where() 中排除列
【发布时间】:2016-05-19 08:26:59
【问题描述】:

我有以下熊猫 df:

import pandas as pd
import numpy as np    

pd_df = pd.DataFrame({'Qu1': ['apple', 'potato', 'cheese', 'banana', 'cheese', 'banana', 'cheese', 'potato', 'egg'],
              'Qu2': ['sausage', 'banana', 'apple', 'apple', 'apple', np.nan, 'banana', 'banana', 'banana'],
              'Qu3': ['apple', 'potato', 'sausage', 'cheese', 'cheese', 'potato', 'cheese', 'potato', 'egg']})

我只想在 Qu1Qu2 两列上实现 where() 并保留其余部分 original stackoverflow question ,所以我创建了pd1

pd1 = pd_df.where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2,
                              "other")[['Qu1', 'Qu2']]

然后我将pd_df,pd_df['Qu3'] 的其余部分添加到pd1

pd1['Qu3'] = pd_df['Qu3']
pd_df = []

我的问题是:最初我想在df 的一部分上执行where() 并保持其余列不变,那么上面的代码对大型数据集是否有危险?我可以这样破坏原始数据吗?如果是,最好的方法是什么?

非常感谢!

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    您可以明确地获取原始 df 的 copy,然后覆盖该 df 的选择:

    In [40]:
    pd1 = pd_df.copy()
    pd1[['Qu1', 'Qu2']] = pd1[['Qu1', 'Qu2']].where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2,
                                  "other")
    pd1
    
    Out[40]:
          Qu1     Qu2      Qu3
    0   other   other    apple
    1  potato  banana   potato
    2  cheese   apple  sausage
    3  banana   apple   cheese
    4  cheese   apple   cheese
    5  banana   other   potato
    6  cheese  banana   cheese
    7  potato  banana   potato
    8   other  banana      egg
    

    所以这里的区别是我们只对df的一部分进行操作,而不是整个df然后选择感兴趣的cols

    更新

    如果您只想覆盖这些列,那么只需选择那些:

    In [48]:
    pd_df[['Qu1', 'Qu2']] = pd_df[['Qu1', 'Qu2']].where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2,
                                  "other")
    pd_df
    
    Out[48]:
          Qu1     Qu2      Qu3
    0   other   other    apple
    1  potato  banana   potato
    2  cheese   apple  sausage
    3  banana   apple   cheese
    4  cheese   apple   cheese
    5  banana   other   potato
    6  cheese  banana   cheese
    7  potato  banana   potato
    8   other  banana      egg
    

    【讨论】:

    • 谢谢!我的数据集大约是 30G,copy 会在内存中产生另一个 30G 的数据集吗?
    • 您的问题显示您创建了 2 个列的副本,如果您只想覆盖原始列中的这些列,那么您可以删除 copy 行并在原始 df 上执行第二行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多