使用复杂的If Then语句减少CSV中的列值

时间:2018-05-02 22:18:13

标签: python list csv if-statement

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

source myScript.sh
. myScript.sh

前三个月(九月,八月,七月)是夏季,接下来的三个月(五月,四月,三月)是冬季。表格中的值是裁剪代码。我正在努力将价值降低到季节,然后是年度。

所以对于Winter专栏:

  • 如果在冬季(5月,4月,3月)有任何2个,那么填写冬季专栏2
  • 否则请使用May中的任何内容填充Winter列

夏季专栏:

  • 如果在夏季(9月,8月,7月)有任何2个,那么请填写夏季专栏2
  • 否则请使用10
  • 填写Summer列

年度专栏:

  • 如果冬季或夏季列中有2个,则填写年度2
  • 其他一切都是10

这就是我现在正在做的事情,但我想知道是否有更清洁的方法。感谢

`[['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']]`

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

2 个答案:

答案 0 :(得分:0)

使用pandas:

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  

答案 1 :(得分:0)

您可以通过以下方式检查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可能会解决问题。