切片Pandas系列(基于索引)分为多列数据帧

时间:2018-06-11 20:32:58

标签: python python-3.x pandas apply

例如,我尝试将字段切换为' date',将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]])

5 个答案:

答案 0 :(得分:2)

您应始终将日期列转换为pandas datetime对象。您可以通过以下两种方式之一完成此操作: 1.当你提出日期时:

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

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

  1. 您可以将名为to_datetime的方法用于单个列。有关详细信息,请参阅this post
  2. 其次,导入名为datetime的模块

    import datetime as dt
    

    一旦你掌握了这两件事,就可以做到:

    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

    的完整文档

答案 1 :(得分:1)

将字符串转换为datetime并使用datetime-type列'.dt. attributes

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属性可以随时获得这些属性。

答案 2 :(得分:1)

因为它们看起来已经是整数,所以忘记了所有的字符串格式。

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

答案 3 :(得分:1)

假设列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 :(得分: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