【问题标题】:Reducing column values in CSV using complex If Then Statements使用复杂的 If Then 语句减少 CSV 中的列值
【发布时间】:2018-05-02 22:18:12
【问题描述】:

我有一个 CSV 文件,其中包含一个 ID 列、6 个月列、2 个季节列和 1 个年度列。例如:

`[['ID', '20180922', '20180820', '20180728', '20180524', '20180424', '20180322', Winter, Summer, Annual], 
['1', '10', '2', '4', '4', '4', '4', '0', '0', '0'],
['2', '4', '2', '2', '10', '10', '4', '0', '0', '0'],
['3', '10', '2', '4', '4', '2', '4', '0', '0', '0'],
['4', '2', '2', '2', '4', '10', '10', '0', '0', '0'],
['5', '10', '4', '4', '2', '10', '10', '0', '0', '0'],
['6', '2', '2', '4', '10', '10', '10', '0', '0', '0'],
['7', '10', '10', '2', '4', '4', '10', '0', '0', '0']]`

前三个月(9 月、8 月、7 月)是夏季月份,接下来的三个月(5 月、4 月、3 月)是冬季月份。表中的值是作物代码。我试图将值减少到季节然后每年。

所以对于冬季专栏:

  • 如果冬季月份(5 月、4 月、3 月)有任何 2,则用 2 填充 Winter 列
  • 否则,用 5 月的任何内容填充 Winter 列

夏季专栏:

  • 如果夏季月份(9 月、8 月、7 月)有任何 2,则在 Summer 列中填写 2
  • 否则用 10 填充 Summer 列

对于年度列:

  • 如果 Winter 或 Summer 列中有 2,则用 2 填写 Annual
  • 其他都是 10

这就是我现在的做法,但我想知道是否有更清洁的方式来做这件事。谢谢

inputFileName = 'input.csv'
outputFileName = 'output.csv'

with open(inputFileName, 'rb') as inFile, open(outputFileName, 'wb') as outfile:
    r = csv.reader(inFile)
    w = csv.writer(outfile)

    table = list(r)

    w.writerow(table[0])

# Winter
for line in table:
    if line[4] == '2' or line[5] == '2' or line[6] == '2':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '2', line[8], line[9]))

    elif line[4] == '4' and line[5] == '4' and line[6] == '10':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '4', line[8], line[9]))

    elif line[4] == '4' and line[5] == '10' and line[6] == '10':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '4', line[8], line[9]))

    elif line[4] == '10' and line[5] == '4' and line[6] == '10':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '10', line[8], line[9]))

    elif line[4] == '10' and line[5] == '10' and line[6] == '4':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '10', line[8], line[9]))

    elif line[4] == '10' and line[5] == '4' and line[6] == '4':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '10', line[8], line[9]))

    elif line[4] == '10' and line[5] == '10' and line[6] == '10':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '10', line[8], line[9]))

    elif line[4] == '4' and line[5] == '4' and line[6] == '4':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], '4', line[8], line[9]))


# Summer
for row in table:
    if line[1] == '2' or line[2] == '2' or line[3] == '2':
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7], '2', line[9]))

    else:
        w.writerow((line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7], '10', line[9]))

另外,我的代码的 Summer 部分似乎没有运行。

【问题讨论】:

    标签: python list csv if-statement


    【解决方案1】:

    使用熊猫:

    import pandas as pd
    
    data = '''\
    ID,20180922,20180820,20180728,20180524,20180424,20180322,Winter,Summer,Annual
    1,10,2,4,4,4,4,0,0,0
    2,4,2,2,10,10,4,0,0,0
    3,10,2,4,4,2,4,0,0,0
    4,2,2,2,4,10,10,0,0,0
    5,10,4,4,2,10,10,0,0,0
    6,2,2,4,10,10,10,0,0,0
    7,10,10,2,4,4,10,0,0,0'''
    
    df = pd.read_csv(pd.compat.StringIO(data)).set_index('ID')
    #df = pd.read_csv('path/to/file').set_index('ID')
    
    df['Winter'] = df.iloc[:,3:7].apply(lambda x: 2 if 2 in x.values else x[0], axis=1)
    df['Summer'] = df.iloc[:,:3].apply(lambda x: 2 if 2 in x.values else 10, axis=1)
    
    cols = ['Winter','Summer']
    df['Annual'] = df[cols].apply(lambda x: 2 if 2 in x.values else 10, axis=1)
    
    print(df)
    

    返回:

        20180922  20180820  20180728  20180524  20180424  20180322  Winter  \
    ID                                                                       
    1         10         2         4         4         4         4       4   
    2          4         2         2        10        10         4      10   
    3         10         2         4         4         2         4       2   
    4          2         2         2         4        10        10       4   
    5         10         4         4         2        10        10       2   
    6          2         2         4        10        10        10      10   
    7         10        10         2         4         4        10       4   
    
        Summer  Annual  
    ID                  
    1        2       2  
    2        2       2  
    3        2       2  
    4        2       2  
    5       10       2  
    6        2       2  
    7        2       2  
    

    【讨论】:

      【解决方案2】:

      您可以检查 2 是否在冬季月份:

      if '2' in [line[i] for i in range(4,7)]

      此外,除了顺序之外,您还有许多相同的条件。你可以这样做:

      winterlist = [line[i] for i in range(4,7)]
      winterlist.sort()
      

      那你就可以查winterlist,不同的订单不需要不同的案例。

      在你的夏季代码中,将 for row in table 更改为 for line in table 可能会解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        相关资源
        最近更新 更多