将文本拆分为 pandas 数据框:处理不同维度

Spliting text into pandas dataframe : dealing with different dimension

我正在尝试将 series 拆分为 pandas 列,但我正在处理以下问题:

df.head()

                 Opportunity Name     Amount Currency   Amount
       XXXX - XX - 2019 - 01 - 20                 ARS      300 
      YYY - YY - Y -2019 - 01 -21                 CHL      350
       ZZZZ - ZZ - 2019 - 03 - 25                 ARS      500
TT - TT - T - TT - 2019 - 04 - 26                 ARS     1000

每当我尝试获取一个新的数据框时,我可以在其中将日期放在单独的列中。 我将 str.split() 函数与 expands=True 和拆分分隔符 -

一起使用
df['Opportunity Name'].str.split('-' , expand=True)

但我的结果很乱,很难选择带有日期的列,因为它是这样拆分的:

          0      1     2     3     4     5     6      
       XXXX     XX  2019    01    20  None  None
        YYY     YY     Y  2019    01    21  None
       ZZZZ     ZZ  2019    03    25  None  None
         TT     TT     T    TT  2019    04    26

这使得很难分割该数据框,我只想从该字符串 datafrane 列中获取日期

  • 提供真实数据与示例数据一致,日期字符始终在末尾。
  • 使用内置函数 isnumeric 和列表推导来获取列表中的数字
  • ''.join([...][-8:]) 仅组合最后 8 个字符
  • .to_datetime 转换为数据时间格式
df['Date'] = df['Opportunity Name'].apply(lambda x: ''.join([y for y in x if y.isnumeric()][-8:]))
df['Date'] = pd.to_datetime(df['Date'])

print(df)

                    Opportunity Name Amount Currency  Amount       Date
0        XXXX - XX - 32019 - 01 - 20             ARS     300 2019-01-20
1        YYY - YY - Y -2019 - 01 -21             CHL     350 2019-01-21
2         ZZZZ - ZZ - 2019 - 03 - 25             ARS     500 2019-03-25
3  TT - TT - T - TT - 2019 - 04 - 26             ARS    1000 2019-04-26

获取第一个值

df['first_value'] = df['Opportunity Name'].apply(lambda x: x.split('-')[0].strip())
print(df)

                    Opportunity Name Amount Currency  Amount       Date first_value
0        XXXX - XX - 32019 - 01 - 20             ARS     300 2019-01-20        XXXX
1        YYY - YY - Y -2019 - 01 -21             CHL     350 2019-01-21         YYY
2         ZZZZ - ZZ - 2019 - 03 - 25             ARS     500 2019-03-25        ZZZZ
3  TT - TT - T - TT - 2019 - 04 - 26             ARS    1000 2019-04-26          TT