Pandas - 检查列中的值是否与两种格式中的一种匹配

时间:2017-10-30 15:25:35

标签: python regex pandas dataframe

在我的数据框中,我有一个包含日期的列。只有在格式为' YYYYMMDD'或者' MMDD'。此外,如果格式为“MMDD'”,则应从另一列获取年份并将其附加到MMDD日期中,如此;

  df['YYYYMMDD'] = df['YYYY'].astype(str) + df['Date'].astype(str).apply(lambda x: x.zfill(4))

追加后,旧列将被删除,新列重命名为所需的输出。

对于比赛,我已经尝试了正则表达式(df_ori['Date'].str.matches(r'^\d{8}$')),但我收到错误;

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

我尝试df_ori['Date'].astype(str).str.matches(r'^\d{8}$')并提出错误;

'StringMethods' object has no attribute 'matches'

我认为我真的错误地采取了这种做法。任何帮助表示赞赏。

根据要求

df.head():

   YYYY  MMDD
0  2016   525
1  2016   728
2  2014   821
3  2016   311
4  2016   422 

1 个答案:

答案 0 :(得分:1)

您需要str.matchstr.zfill

df['YYYYMMDD'] = df['YYYY'].astype(str) + df['Date'].astype(str).str.zfill(4)

print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{8}$'))
0    True
1    True
2    True
3    True
4    True
Name: YYYYMMDD, dtype: bool

如果想要48匹配:

print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{8}$|^\d{4}$'))

如果想从4到8匹配:

print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{4,8}$'))

编辑:

如果len 4只需要追加:

print (df_ori)
   YYYY  MMDD  YYYYMMDD
0  2016   525  20160525
1  2016   728  20160728
2  2014  1121      1121
3  2016  1211      2211
4  2016   422  20160422

a = df_ori['YYYY'].astype(str) + df_ori['YYYYMMDD'].astype(str)
m = df_ori['YYYYMMDD'].astype(str).str.len() == 4
df_ori['YYYYMMDD'] = df_ori['YYYYMMDD'].mask(m, a)
print (df_ori)
   YYYY  MMDD  YYYYMMDD
0  2016   525  20160525
1  2016   728  20160728
2  2014  1121  20141121
3  2016  1211  20162211
4  2016   422  20160422