【问题标题】:Slice Pandas series (based on index) into multiple columns of dataframe将 Pandas 系列(基于索引)切片成多列数据框
【发布时间】:2018-11-21 04:02:02
【问题描述】:

例如,我正在尝试将包含格式为 YYYYMMDD 的日期的字段“日期”分割成 3 个单独的字段(“年”、“月”、“日”)。

我有一种方法可以一次为每个值分配一个值,但我认为有一种更有效的方法可以产生所需的结果。

目前的解决方案:

df['year'] = df['date'].astype(str).apply(lambda x: x[:4])
df['month'] = df['date'].astype(str).apply(lambda x: x[4:6])
df['day'] = df['date'].astype(str).apply(lambda x: x[6:8])

以下是我尝试简化代码的一个示例:

df['year'], df['month'], df['day'] = df['date'].astype(str).apply(lambda x: [x[:4], x[4:6], x[6:8]])

【问题讨论】:

  • 谢谢大家!所有解决方案都运行良好。我选择了 MaxU 的答案,因为它可以应用于任何固定宽度的字符串。

标签: python python-3.x pandas apply


【解决方案1】:

这是一个使用operator.attrgetter的功能解决方案:

from operator import attrgetter

df = pd.DataFrame({'Date': [20180131, 20180611, 20180513]})

df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d')

parts = ('year', 'month', 'day')

df['Year'], df['Month'], df['Day'] = zip(*df['Date'].apply(attrgetter(*parts)).values)

print(df)

        Date  Year  Month  Day
0 2018-01-31  2018      1   31
1 2018-06-11  2018      6   11
2 2018-05-13  2018      5   13

【讨论】:

    【解决方案2】:

    您应该始终将日期列转换为 pandas 日期时间对象。您可以通过以下两种方式之一执行此操作: 1. 当您输入日期时:

     df = pd.read_csv('your-raw_date.csv', parse_dates=[5,7])
    

    注意:5 和 7 是日期所在的列号。

    1. 您可以使用名为to_datetime 的方法来处理单个列。详情请见this post

    其次,导入一个名为datetime的模块

    import datetime as dt
    

    一旦你有了这 2 件事,你就可以做这样的事情:

    df['year'] = df['date'].dt.year
    df['month'] = df['date'].dt.month
    df['day'] = df['date'].dt.day
    

    你可以做其他很酷的事情,比如

    dt['signup_date_dayofweek'] = dt['date'].dt.dayofweek
    

    查看datatime module的完整文档

    【讨论】:

      【解决方案3】:

      假设列 date 是字符串 (object) dtype:

      In [18]: df
      Out[18]:
             date
      0  20180131
      1  20180611
      2  20180513
      
      In [19]: df.dtypes
      Out[19]:
      date    object
      dtype: object
      

      解决方案:

      In [22]: df[['year','month','day']] = df.date.str.extract(r'(\d{4})(\d{2})(\d{2})').astype(int)
      
      In [23]: df
      Out[23]:
             date  year  month  day
      0  20180131  2018      1   31
      1  20180611  2018      6   11
      2  20180513  2018      5   13
      
      In [24]: df.dtypes
      Out[24]:
      date     object
      year      int32
      month     int32
      day       int32
      dtype: object
      

      PS 如果date 是数字dtype,那么我会选择@ALollz 的解决方案...

      【讨论】:

        【解决方案4】:

        由于它们看起来已经是整数,所以忘记所有字符串格式。

        df['year'] = df.date//10**4
        df['month'] = df.date//100%100
        df['day'] = df.date%100
        

        【讨论】:

          【解决方案5】:

          将字符串转换为日期时间并使用日期时间类型列的.dt. 属性

          df.date = pd.to_datetime(df.date, format='%Y%m%d')
          df['year'], df['month'], df['day'] = df.date.dt.year, df.date.dt.month, df.date.dt.day
          

          将日期从日期转换为日期时间后,您可能会发现甚至不需要提取年、月和日,因为这些属性可以通过date 列的dt 属性轻松获得。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-03
            • 1970-01-01
            • 2017-08-11
            • 1970-01-01
            • 2018-08-11
            • 2018-03-12
            • 2017-01-17
            相关资源
            最近更新 更多