簡體   English   中英

切片Pandas系列(基於索引)分為多列數據幀

[英]Slice Pandas series (based on index) into multiple columns of dataframe

例如,我正在嘗試將一個字段“日期”切片,將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]])

您應該始終將日期列轉換為pandas datetime對象。 您可以通過以下兩種方式之一完成此操作:1。當您提出日期時:

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

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

  1. 您可以將名為to_datetime的方法用於單個列。 有關詳細信息,請參閱此帖

其次,導入一個名為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模塊的完整文檔

將字符串轉換為datetime並使用datetime-type列' .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屬性可以輕松獲得屬性。

因為看起來它們已經是整數,所以忘記所有的字符串格式。

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

假設列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的解決方案......

這是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM