【问题标题】:Read CSV column, if requirements met, write to a cell读取 CSV 列,如果满足要求,写入单元格
【发布时间】:2020-09-24 17:34:13
【问题描述】:

我正在尝试读取 CSV 文件的第一列,看看它是否符合要求。如果符合要求,我想写到以下列之一。

正如您从我的代码中看到的那样,我的阅读工作正常(虽然不确定是否是最好的方法)我只需要让它写入该行的第 3 列。

示例: 如果第一列中的任何行包含以 25 开头的 4 位值,请在该行的第 3 列中输入 Y。

CSV 示例:

number,na,prefix25,na,na,na
1000,,,,,
1254,,,,,
251,,,,,
2501,,,,,
6548,,,,,
1478,,,,,
02,,,,,
2550,,,,,
2569,,,,,

所需的 CSV 输出:

number,na,prefix25,na,na,na
1000,,,,,
1254,,,,,
251,,,,,
2501,,y,,,
6548,,,,,
1478,,,,,
02,,,,,
2550,,y,,,
2569,,y,,,

到目前为止的代码:

def micro():
    #Prefix 25
    with open(dbPath) as f:
        reader = csv.reader(f, delimiter="\t")
        for i in reader:
            if len(i[0]) == 4:
                curStore = i[0].startswith("25")
                if curStore is True:
                    #Prints found numbers what are 4 digits and start with 25
                    print(i[0])

提前感谢您的帮助

【问题讨论】:

    标签: python python-3.x pandas csv


    【解决方案1】:

    pandas 是为此任务而生的。

    import pandas as pd
    
    df = pd.read_csv(<path_to_file>)
    df['prefix25'] = df['number'].apply(lambda x: 'y' if str(x).startswith('25') else None)
    df.to_csv(<path_and_file_name>)
    

    【讨论】:

    • 所以这似乎有效,但是更新后的 CSV 添加了一个列。例如:0,40,,,,,,,,,,,,,,,,
    • df.to_csv(&lt;path_and_file_name&gt;, index=False)
    【解决方案2】:

    这是使用mappandas 解决方案。 map 方法比 apply 更有效,因为它用于 column 明智的操作,而 apply 可用于 columns >数据框

    import pandas as pd
    
    #reading the csv as a dataframe  
    df = pd.read_csv('test.csv', delimiter=',')
    
    #applying a lambda function using map
    df['prefix25'] = df['number'].map(lambda x: 'y' if (str(x).startswith('25') and len(str(x))==4)  else '')
    
    #replacing `NaN` with '' to match your requirements 
    df.fillna('',inplace=True) 
    
    #matching the columns as pandas automatically renames same columns 
    df.columns = ['number','na','prefix25','na','na','na']
    
    #saving the output csv
    df.to_csv('output.csv',index=False) 
    

    输出

    number,na,prefix25,na,na,na
    1000,,,,,
    1254,,,,,
    251,,,,,
    2501,,y,,,
    6548,,,,,
    1478,,,,,
    2,,,,,
    2550,,y,,,
    2569,,y,,,                                     
    

    【讨论】:

    • 这很好用。唯一缺少的要求是,我不确定如何添加到您的方法中,它需要有 4 位数字并以 25 为前缀。
    • 您的意思是 2550y 而不是 y。能举个例子吗?
    • 当然。从上面的输出中,第 251 行不应该有 y,因为它没有 4 位数字。但是 2501 应该有一个 y,因为它是 4 位数字并且以 25 开头。
    • 好的。添加了快速修复。你能检查它是否适合你吗?
    • 工作完美!
    【解决方案3】:

    这是使用temp 文件的一种方法

    import csv
    import os
    
    def micro():
        #Prefix 25
        with open(dbPath) as f, open("temp_file", "w") as temp_outfile:  #Please provide full path to temp file
            reader = csv.reader(f, delimiter="\t")
            writer = csv.writer(temp_outfile, delimiter="\t")
            for i in reader:
                if len(i[0]) == 4 and i[0].startswith("25"):
                    i[2] = "Y"
                writer.writerow(i)
                
                #Replace Old File with TempFile
                os.rename("temp_file", dbPath)
    

    【讨论】:

      【解决方案4】:

      尝试以下易于理解的步骤:

      import pandas as pd
      df = pd.read_csv('sofile.csv',',')
      numlist = df.number.astype(str)
      outlist = ['y' if (len(x)==4 and x.startswith('25')) else ''
                  for x in numlist ]
      df.prefix25 = outlist
      print(df)
      

      输出:

         number  na prefix25  na.1  na.2  na.3
      0    1000 nan            nan   nan   nan
      1    1254 nan            nan   nan   nan
      2     251 nan            nan   nan   nan
      3    2501 nan        y   nan   nan   nan
      4    6548 nan            nan   nan   nan
      5    1478 nan            nan   nan   nan
      6       2 nan            nan   nan   nan
      7    2550 nan        y   nan   nan   nan
      8    2569 nan        y   nan   nan   nan
      

      可以使用df.to_csv('newfile.csv')函数保存回csv。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2018-12-04
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        相关资源
        最近更新 更多