【问题标题】:Python Pandas: Applying changes to specific columns by column namesPython Pandas:按列名将更改应用于特定列
【发布时间】:2015-09-08 15:09:44
【问题描述】:

所以我有一个 [Python2.7] Pandas 数据框(df),如下所示:

        name    flag  dummy_D random ID dummy_S dummy_T 
0       Mick  Purple    2     NaN   1     21       32
1       John     Red   NaN    NaN   2    w32       4  
2  Christine     NaN    2     NaN   2    w33       3 
3     Stevie     NaN    4     NaN   2    w34       2 
4    Lindsey     NaN    5     NaN   2    w35      NaN 

我想用以前的值替换用“虚拟”声明的列中的所有 NaN(并且只有这些列,而数据框的其余部分保持不变)

这就是我所做的:

dummycol = [col for col in df.columns if 'dummy' in col] 

for d in dummycol:
      df[d] = df[d].fillna(method = 'pad')

我的问题是:

在 Pandas 中是否有更好的(在编码和内存效率方面)方法来执行此操作,而不是浪费内存来创建列表 + 循环遍历它?有一个单线解决方案会很棒!

提前非常感谢!

【问题讨论】:

    标签: python pandas multiple-columns


    【解决方案1】:

    您可以这样做,因此您可以在列上调用str.startswith 以获取感兴趣的列,然后同时在所有这些列上调用fillna

    In [152]:
    cols = df.columns[df.columns.str.startswith('dummy')]
    df[cols] = df[cols].fillna(method='pad')
    df
    
    Out[152]:
            name    flag  dummy_D  random  ID dummy_S  dummy_T
    0       Mick  Purple        2     NaN   1      21       32
    1       John     Red        2     NaN   2     w32        4
    2  Christine     NaN        2     NaN   2     w33        3
    3     Stevie     NaN        4     NaN   2     w34        2
    4    Lindsey     NaN        5     NaN   2     w35        2
    

    【讨论】:

      【解决方案2】:

      这避免了您的列表理解,并且只在列上循环一次:

      for d in df.columns:
          df[d] = df[d].fillna(method = 'pad') if 'dummy' in d
      

      【讨论】:

      • 谢谢,但我更喜欢 EdChum 的想法,因为它不涉及 For 语句 -> 我从 Python 迁移到 Pandas 的主要结果之一
      【解决方案3】:

      您可以将条件列表推导与.loc 一起使用:

      _ = [df.loc[:, col].fillna(method='ffill', inplace=True) for col in df if col[:5] == 'dummy']
      
      >>> df
              name    flag  dummy_D  random  ID dummy_S  dummy_T
      0       Mick  Purple        2     NaN   1      21       32
      1       John     Red        2     NaN   2     w32        4
      2  Christine     NaN        2     NaN   2     w33        3
      3     Stevie     NaN        4     NaN   2     w34        2
      4    Lindsey     NaN        5     NaN   2     w35        2
      

      【讨论】:

      • 谢谢,但我发现 EdChum 的想法更容易理解,因为我不熟悉 .loc 。我希望我能及时变得更好!
      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2014-01-19
      • 1970-01-01
      • 2017-06-19
      • 2020-08-18
      • 2023-01-31
      • 2021-03-29
      • 1970-01-01
      相关资源
      最近更新 更多