我有一个包含ID列,6个月列,2个季列和1个年度列的CSV文件。例如:
source myScript.sh
. myScript.sh
前三个月(九月,八月,七月)是夏季,接下来的三个月(五月,四月,三月)是冬季。表格中的值是裁剪代码。我正在努力将价值降低到季节,然后是年度。
所以对于Winter专栏:
夏季专栏:
年度专栏:
这就是我现在正在做的事情,但我想知道是否有更清洁的方法。感谢
`[['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部分似乎没有运行。
答案 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
可能会解决问题。