【问题标题】:Is there a better way to split a pandas dataframe column based on some characters?有没有更好的方法来根据某些字符拆分熊猫数据框列?
【发布时间】:2021-06-14 06:23:12
【问题描述】:

如何分隔下面日期列中的日期。分隔符是 Y,X 还是 " "?

xx = {'Code': ["001", "002","003"], 'Date': ["202103151716Y202103151716","202103151716X202103151716","202103151716 202103151716"]}
df = pd.DataFrame(data=xx)
df
    Code     Date
0   001 202103151716Y202103151716
1   002 202103151716X202103151716
2   003 202103151716 202103151716

我下面的解决方案一次找到一个字符,即 Y 或 X,但不能同时找到这两个字符。它用“”替换它们,然后将它们分开。有什么方法可以编写一个查找 X、Y 或空格(“”)并使用空格分隔它们的语句?与运行以下三个语句替换 Y,然后替换 X 相比,在我的解决方案中更像是 OR 语句。

df['Date'] = df['Date'].str.replace('Y',' ') #Replace Y with space
df['Date'] = df['Date'].str.replace('X',' ')
df[['Date1', 'Date2']] = df['Date'].str.split(' ', 1, expand=True) # Splits the column into two other columns, Date1 and  Date2

预期输出:

    Code    Date                     Date1           Date2
0   001 202103151716 202103151716   202103151716    202103151716
1   002 202103151716 202103151716   202103151716    202103151716
2   003 202103151716 202103151716   202103151716    202103151716

【问题讨论】:

  • df[['Date1', 'Date2']] = df['Date'].str.split(r'\D+', 1, expand=True)?
  • 或者更具体地说是df[['Date1', 'Date2']] = df['Date'].str.split('[XY ]', 1, expand=True)
  • 你是个传奇。这样可行。你介意@WiktorStribiżew 解释这部分 r'\D+' 吗?
  • @Nick 这在这种情况下有效。
  • @Hummer 是的,这就是重点,正则表达式 ([XY ]) 特定于您提出的问题。 Wiktors 正则表达式更通用。

标签: python regex pandas dataframe


【解决方案1】:

您可以使用\D+ 模式直接拆分列数据,该模式匹配一​​个或多个数字以外的字符(因为空格,XY 是非数字):

import pandas as pd
xx = {'Code': ["001", "002","003"], 'Date': ["202103151716Y202103151716","202103151716X202103151716","202103151716 202103151716"]}
df = pd.DataFrame(data=xx)
df[['Date1', 'Date2']] = df['Date'].str.split(r'\D+', 1, expand=True)
df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'])
df
# =>  Code                       Date               Date1               Date2
#   0  001  202103151716Y202103151716 2021-03-15 17:16:00 2021-03-15 17:16:00
#   1  002  202103151716X202103151716 2021-03-15 17:16:00 2021-03-15 17:16:00
#   2  003  202103151716 202103151716 2021-03-15 17:16:00 2021-03-15 17:16:00

所以,一开始就没有必要更换任何东西。

用非数字字符分隔后,您可以使用pd.to_datetime() 将日期时间数值转换为日期时间类型。

注意 [ XY] 是一个只匹配空格、XY 的字符类,但似乎 \D+ 非数字模式对数据应该是安全的你展示了。

【讨论】:

  • 感谢 Wiktor 跟进回答。是的,效果很好。
  • 厚脸皮的单线 df['Date1'], df['Date2'] = map(pd.to_datetime, zip(*df.Date.str.split('\D+'))) 扩充现有数据框
  • 另一个单行 df.assign(**df.Date.str.extract('(?P<Date1>\d+)\D+(?P<Date2>\d+)').apply(pd.to_datetime)) 生成数据帧的副本
  • @Hummer 它们是 WS 解决方案的变体。除非它们对您完全有意义,否则最好在答案中使用解决方案,因为它对于正在发生的事情是最明显的。
  • @Hummer (?P<Date1>...) 是一个命名的捕获组,在 Pandas 中用于提取匹配的一部分,并自动使用组的名称将该子匹配放入特定列。跨度>
猜你喜欢
  • 2019-04-21
  • 2016-11-16
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多