【问题标题】:how to modify multiple columns at once?如何一次修改多个列?
【发布时间】:2017-12-13 15:59:14
【问题描述】:

考虑这个简单的例子

df = pd.DataFrame({'dt_one': ['2015-01-01', '2016-02-02'],
              'dt_two': ['2015-01-01', '2016-02-02'],
              'other_col': [1, 2]})

df    
Out[30]: 
       dt_one      dt_two  other_col
0  2015-01-01  2015-01-01          1
1  2016-02-02  2016-02-02          2

我想将pd.to_datetime 应用于所有包含dt_ 的列

我可以通过filter轻松做到这一点

df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x))
Out[33]: 
      dt_one     dt_two
0 2015-01-01 2015-01-01
1 2016-02-02 2016-02-02

但是,如何在原始数据框中分配这些值? 正在做:

df.filter(regex = 'dt_') = df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x))
  File "<ipython-input-34-412d88939494>", line 1
    df.filter(regex = 'dt_') = df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x))
SyntaxError: can't assign to function call

没用

谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    该方法不起作用,因为df.filter(regex='dt_') 是修改后的副本。要为多列分配数据,您需要使用基于索引的选择从实际数据框中选择列,或者使用assign 就地分配。

    因此,在过滤后获取列并在分配之前进行布尔索引,即

    df[df.filter(regex = 'dt_').columns] = df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x))
    
    dt_one dt_two other_col 0 2015-01-01 2015-01-01 1 1 2016-02-02 2016-02-02 2

    【讨论】:

    • 非常清楚地感谢 bharath,但是我认为 jezrael 是第一个并提交了相同的答案。再次感谢!
    • 我急着回答。我知道jez会为此而来。这就是为什么我先发布代码,虽然无法击败他。
    【解决方案2】:

    您需要分配给过滤的列:

    cols =  df.filter(regex = 'dt_').columns         
    df[cols] = df[cols].apply(lambda x: pd.to_datetime(x))
    print (df)
          dt_one     dt_two  other_col
    0 2015-01-01 2015-01-01          1
    1 2016-02-02 2016-02-02          2
    

    或者分配给mask选择的列:

    m =  df.columns.str.contains('dt_')    
    df.loc[:,m] = df.loc[:,m].apply(lambda x: pd.to_datetime(x))
    print (df)
          dt_one     dt_two  other_col
    0 2015-01-01 2015-01-01          1
    1 2016-02-02 2016-02-02          2
    

    【讨论】:

    【解决方案3】:

    您可以对assign 使用“解包”:

    df_out = df.assign(**df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x)))
    
          dt_one     dt_two  other_col
    0 2015-01-01 2015-01-01          1
    1 2016-02-02 2016-02-02          2
    

    还有信息:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2 entries, 0 to 1
    Data columns (total 3 columns):
    dt_one       2 non-null datetime64[ns]
    dt_two       2 non-null datetime64[ns]
    other_col    2 non-null int64
    dtypes: datetime64[ns](2), int64(1)
    memory usage: 128.0 bytes
    

    【讨论】:

    • 我认为 uppacking 是 python 的原生语言。此方法创建一个新的数据框,其他人在这里回答修改原始数据框。您可以使用此方法进行更好的错误跟踪和回滚。到上一个数据帧。
    【解决方案4】:

    您可以像这样分配值。

    df['dt_one'],df['dt_two']=df.filter(regex = 'dt_').apply(lambda x: pd.to_datetime(x)).values
    
    
    df.dtypes
    Out[215]: 
    dt_one       datetime64[ns]
    dt_two       datetime64[ns]
    other_col             int64
    dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      相关资源
      最近更新 更多