【问题标题】:When importing csv to PANDAS, how can you only import columns that contain a specified string within them?将csv导入PANDAS时,如何只导入其中包含指定字符串的列?
【发布时间】:2020-09-29 05:03:31
【问题描述】:

我有数千个 CSV 文件,每个文件包含数百列和数十万行。对于速度,我只想将数据导入我需要的 PANDAS 数据帧。我可以使用单独的元数据文件过滤我们不需要的 CSV 文件,但是我无法弄清楚如何删除我不需要的列(在导入期间——我知道如何过滤数据框的列导入后,但就像我说的,我试图避免导入不必要的数据)。

假设我有以下 csv 文件:

Date/Time  Apple Tart  Cherry Pie  Blueberry Pie  Banana Pudding  Tomato Soup
1:00       2           4           7              6               5
2:00       3           5           4              5               8
3:00       1           4           7              4               4

我只想导入包含文本“Pie”的列以及“日期/时间”列。另请注意,我的所有 csv 文件的列名和列数都不同,因此“usecol”规范对我不起作用,因为我不知道要输入的具体列名。

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    pandas 中的usecols 参数read_csv 接受一个函数来过滤您感兴趣的列:

    import pandas as pd
    from io import StringIO
    
    data = """Date/Time  Apple Tart  Cherry Pie  Blueberry Pie  Banana Pudding  Tomato Soup
    1:00       2           4           7              6               5
    2:00       3           5           4              5               8
    3:00       1           4           7              4               4"""
    
    
    df = pd.read_csv(StringIO(data),
                     sep='\s{2,}',
                     engine='python',
                     #this is the key part of the code for your usecase
                     #looks for columns that contain Pie or Date/Time
                     #and returns only those columns
                     #quite extensible as well, since it accepts a function
                     usecols = lambda x: ("Pie" in x) or ("Date/Time" in x) )
    df
    
    
    Date/Time   Cherry Pie  Blueberry Pie
    0   1:00    4   7
    1   2:00    5   4
    2   3:00    4   7
    

    【讨论】:

    • 这很完美,大大提高了我的工作流程速度。谢谢。
    【解决方案2】:

    使用read_csv()作为列表时可以指定列名,例如:

    df=pd.read_csv('fila.csv',names=['columnName#1','columnName3'])
    

    看我没有使用'columnName2'。

    【讨论】:

    • 如果你想添加命名的列标题,我相信,名称会覆盖列的名称。 Use_cols 将允许我指定要导入的 CSV 列。如果我有一个我知道要提前使用哪些名称的 CSV 文件,或者甚至有多个使用相同列名的 CSV 文件,这将正常工作。问题是我有数千个 CSV 文件,它们都有不同的列名。就像上面的示例一样,我只想引入包含字符串“Pie”的所有列。这可能是 0 列,也可能是数百列。
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 2020-06-09
    • 2015-07-21
    • 1970-01-01
    • 2017-07-21
    • 2016-09-30
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多