我有以下DataFrame:
NAME
0 this_is_a_sample_2017-09-08.csv
1 this_is_a_sample_2017-09-09.csv
2 this_is_a_sample_2017-09-10.csv
3 this_is_a_sample_2017-09-11.csv
4 this_is_a_sample_2017-09-12.csv
5 this_is_a_sample_2017-09-13.csv
以下是创建它的代码:
rows = ['this_is_a_sample_2017-09-08','this_is_a_sample_2017-09-09','this_is_a_sample_2017-09-10','this_is_a_sample_2017-09-11','this_is_a_sample_2017-09-12','this_is_a_sample_2017-09-13']
df = pd.DataFrame(rows, columns = ['NAME'])
我想要一个新列,其中只包含名称的日期部分。生成的DataFrame如下所示:
NAME DATE
0 this_is_a_sample_2017-09-08.csv 2017-09-08
1 this_is_a_sample_2017-09-09.csv 2017-09-09
2 this_is_a_sample_2017-09-10.csv 2017-09-10
3 this_is_a_sample_2017-09-11.csv 2017-09-11
4 this_is_a_sample_2017-09-12.csv 2017-09-12
我尝试了以下内容:
df['DATE'] = df.NAME.str.split(".")[0].split('_')[-1]
我以为我可以将列拆分两次并从列表中获取日期,但是当我使用[0]
对其进行索引时,它会选择第一行中的值,即列表。
答案 0 :(得分:5)
使用.str访问器选择系列的索引,即
df['Date'] = df['NAME'].str.split(".").str[0].str.split('_').str[-1]
NAME Date 0 this_is_a_sample_2017-09-08 2017-09-08 1 this_is_a_sample_2017-09-09 2017-09-09 2 this_is_a_sample_2017-09-10 2017-09-10 3 this_is_a_sample_2017-09-11 2017-09-11 4 this_is_a_sample_2017-09-12 2017-09-12 5 this_is_a_sample_2017-09-13 2017-09-13
答案 1 :(得分:2)
或使用正则表达式
df['Date'] = df['NAME'].str.extract('.*?_(\d+-\d+-\d+).csv', expand = False)
NAME Date
0 this_is_a_sample_2017-09-08.csv 2017-09-08
1 this_is_a_sample_2017-09-09.csv 2017-09-09
2 this_is_a_sample_2017-09-10.csv 2017-09-10
3 this_is_a_sample_2017-09-11.csv 2017-09-11
4 this_is_a_sample_2017-09-12.csv 2017-09-12
5 this_is_a_sample_2017-09-13.csv 2017-09-13
或者@Evan建议,使用
df['Date'] = df['NAME'].str.extract('([\d-]+)', expand = False)
答案 2 :(得分:0)
不确定为什么你有"分裂('。'),"所有你真正需要的是:
df['DATE'] = df['NAME'].str.split('_').str[-1]
NAME DATE
0 this_is_a_sample_2017-09-08 2017-09-08
1 this_is_a_sample_2017-09-09 2017-09-09
2 this_is_a_sample_2017-09-10 2017-09-10
3 this_is_a_sample_2017-09-11 2017-09-11
4 this_is_a_sample_2017-09-12 2017-09-12
5 this_is_a_sample_2017-09-13 2017-09-13