【问题标题】:Python: Replace the special character by NULL in each column in pandas dataframePython:将熊猫数据框中每一列中的特殊字符替换为NULL
【发布时间】:2020-10-28 12:41:24
【问题描述】:

我有一个如下的数据框:

ID      Date_Loading          Date_delivery       Value
001     01.11.2017             20.11.2017         200.34
002     %^&**##_               15.01.2018         300.05
003     11.12.2018             _%67*              7*7%

我们可以看到,除了ID 列之外,我在所有列中都有特殊字符。

目标:将这些特殊字符替换为None。所以最终的数据框应该是这样的:

ID      Date_Loading          Date_delivery       Value
001     01.11.2017             20.11.2017         200.34
002     Null                   15.01.2018         300.05
003     11.12.2018             Null               Null

下一步,我想将日期列解析为 YYYY-MM-DD 格式。

为了实现这一点,我使用以下代码 sn-p:

for c in df.columns.tolist():
  df[c] = df[c].astype(str).str.replace(r"[^A-Za-z0-9]"," ")
df['Date_Loading'] = pd.to_datetime(df['Date_Loading'],error='coerce',format='YYYY-MM-DD')
df['Date_delivery'] = pd.to_datetime(df['Date_Loading'],error='coerce',format='YYYY-MM-DD')

但是上面的代码是行不通的!!!即使我尝试替换,它也不起作用。

我错过了什么吗?

P.S.:我已经尝试过 SO -> thisthis 但到目前为止还没有运气

【问题讨论】:

  • 还有其他栏目吗?如果是,应该如何处理?所有其他列都变成数字了吗?
  • @jezrael:只需在str.replace 中添加regex=True 即可。但我需要根据需要转换日期字段,即YYYY-MM-DD 格式。
  • But I need to convert the date fields as I wanted i.e. YYYY-MM-DD format. - 不确定现在理解是否不起作用?
  • 是的,它正在工作。只是为了我的理解,如果我做一个 pd.read_csv(file,parse_dates = date_cols),它会像你解释的那样做这项工作吗?我现在不关心Value 字段。
  • 不幸的是,不仅需要自定义功能,请给我一个秒。

标签: python pandas


【解决方案1】:

您可以指定输入数据的日期时间格式,此处为DD.MM.YYYY '%d.%m.%Y',对于转换数字,请使用to_numeric

 #for processing all columns
 df = df.astype(str).replace(r"[^A-Za-z0-9]","", regex=True)

df['Date_Loading'] = pd.to_datetime(df['Date_Loading'],errors='coerce',format='%d.%m.%Y')
df['Date_delivery'] = pd.to_datetime(df['Date_delivery'],errors='coerce',format='%d.%m.%Y')

df['Value'] = pd.to_numeric(df['Value'],errors='coerce')
print (df)
   ID Date_Loading Date_delivery   Value
0   1   2017-11-01    2017-11-20  200.34
1   2          NaT    2018-01-15  300.05
2   3   2018-12-11           NaT     NaN

print (df.dtypes)
ID                        int64
Date_Loading     datetime64[ns]
Date_delivery    datetime64[ns]
Value                   float64
dtype: object

编辑:

dateparse = lambda x: pd.to_datetime(x, format='%d.%m.%Y', errors='coerce',)

df = pd.read_csv(file, parse_dates=['Date_Loading','Date_delivery'], date_parser=dateparse)
    
print (df)
   ID Date_Loading Date_delivery   Value
0   1   2017-11-01    2017-11-20  200.34
1   2          NaT    2018-01-15  300.05
2   3   2018-12-11           NaT    7*7%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2022-07-22
    • 2018-02-02
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多