【问题标题】:Is it possible to set a custom delimiter/separator for a specific column when cleaning data with pandas?使用 pandas 清理数据时,是否可以为特定列设置自定义分隔符/分隔符?
【发布时间】:2021-04-15 00:04:49
【问题描述】:

我的数据集是一个用冒号 (:) 分隔的 .txt 文件。其中一列包含日期 AND 时间,日期由反斜杠 (/) 分隔,这很好。但是,时间用冒号 (:) 分隔,就像其他数据一样,这会影响我清理数据的方法。

数据集的几行示例:

USA:Houston, Texas:05/06/2020 12:00:00 AM:car
Japan:Tokyo:05/06/2020 11:05:10 PM:motorcycle
USA:Houston, Texas:12/15/2020 12:00:10 PM:car
Japan:Kyoto:01/04/1999 05:30:00 PM:bicycle

我想在使用 pandas 将数据集加载到 python 中的数据框之前清理数据集。如何分隔列?我不能用

df = pandas.read_csv('example.txt', sep=':', header=None)

因为这会将时间数据分成不同的列。有什么想法吗?

【问题讨论】:

    标签: python-3.x pandas dataframe data-cleaning


    【解决方案1】:

    您可以将列串联起来:

    df = pandas.read_csv("example.txt", sep=":", header=None)
    
    df[6] = pd.to_datetime(
        df[2].astype(str) + ":" + df[3].astype(str) + ":" + df[4].astype(str)
    )
    
    df = df[[0, 1, 6, 5]].rename(
        columns={0: "State", 1: "City", 6: "Time", 5: "Type"}
    )
    print(df)
    

    打印:

       State            City                Time        Type
    0    USA  Houston, Texas 2020-05-06 00:00:00         car
    1  Japan           Tokyo 2020-05-06 23:05:10  motorcycle
    2    USA  Houston, Texas 2020-12-15 12:00:10         car
    3  Japan           Kyoto 1999-01-04 17:30:00     bicycle
    

    【讨论】:

      【解决方案2】:
      pd.read_csv(file, sep=r"(?:(?<!\d):(?!\d)?)", header=None)
      

      查看demo 获取正则表达式!

      正则表达式正在寻找: 后面的非数字,通过在?&lt;! 后面的否定查找和可能: 后面通过否定查找的非数字。后者是可选的以覆盖案例,例如Tokyo:05 也在这里拆分。开头的?: 表示“不要保留您在结果中找到的:”。

      我明白了:

             0               1                       2           3
      0    USA  Houston, Texas  05/06/2020 12:00:00 AM         car
      1  Japan           Tokyo  05/06/2020 11:05:10 PM  motorcycle
      2    USA  Houston, Texas  12/15/2020 12:00:10 PM         car
      3  Japan           Kyoto  01/04/1999 05:30:00 PM     bicycle
      

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        相关资源
        最近更新 更多