@@ -76,17 +76,21 @@ def getValueType(val):
76
76
return val
77
77
return None
78
78
79
- def getColumn (name , dfcols ):
79
+ def getColumn (name , dfcols , value_cols = None ):
80
+ dfname = None
80
81
if name in dfcols :
81
- return name
82
+ dfname = name
82
83
else :
83
84
try :
84
- i = int (name )
85
- return dfcols [i ]
86
- except Exception :
87
- print ('%s not a column in %s' % (name , dfcols ),
88
- file = sys .stderr )
89
- exit (1 )
85
+ i = int (name ) - 1
86
+ dfname = dfcols [i ]
87
+ except IndexError :
88
+ sys .exit ('%s not an index into %s' % (name , dfcols ))
89
+ except ValueError :
90
+ sys .exit ('%s not a column in %s' % (name , dfcols ))
91
+ if value_cols and dfname not in value_cols :
92
+ sys .exit ('%s not a value column in %s' % (name , value_cols ))
93
+ return dfname
90
94
91
95
def getColumns (val , dfcols ):
92
96
fields = [v .strip () for v in val .split (',' )]
@@ -95,16 +99,15 @@ def getColumns(val, dfcols):
95
99
cols .append (getColumn (name , dfcols ))
96
100
return cols
97
101
98
- def getAggFunc (funcStr , dfcols ):
102
+ def getAggFunc (funcStr , dfcols , value_cols ):
99
103
af = funcStr
100
104
try :
101
105
af = json .loads (funcStr )
102
106
except JSONDecodeError as de :
103
- print ('"%s" is not a json string: ' % funcStr , de .msg ,
104
- file = sys .stderr )
105
- exit (1 )
107
+ sys .exit ('"%s" is not a json string: %s' % (funcStr , de .msg ))
106
108
if isinstance (af , dict ):
107
- aggfunc = {getColumn (k , dfcols ): v for k , v in af .items ()}
109
+ aggfunc = {getColumn (k , dfcols , value_cols ): v
110
+ for k , v in af .items ()}
108
111
elif isinstance (af , list ):
109
112
aggfunc = af
110
113
else :
@@ -127,11 +130,12 @@ def getAggFunc(funcStr, dfcols):
127
130
columns = getColumns (args .columns , df_columns )
128
131
values = getColumns (args .values , df_columns )
129
132
fill_value = getValueType (args .fill_value )
130
- aggfunc = getAggFunc (args .aggfunc .replace ('\' ' , '"' ), values )
133
+ aggfunc = getAggFunc (args .aggfunc .replace ('\' ' , '"' ), df_columns , values )
131
134
pdf = df .pivot_table (index = index , columns = columns ,
132
135
values = values , aggfunc = aggfunc ,
133
136
fill_value = fill_value )
134
- pdf_cols = ['_' .join (reversed (p )) if isinstance (p , tuple ) else p
137
+ pdf_cols = ['_' .join ([str (x ) for x in reversed (p )])
138
+ if isinstance (p , tuple ) else str (p )
135
139
for p in pdf .columns .tolist ()]
136
140
pdf .to_csv (args .output ,
137
141
sep = '\t ' ,
0 commit comments