一种合并“列”的通用方法,可让您指定预期的列以及预先合并的内容:
def merged_pivot(data, *output_names, **merged_columns):
input_names = []
column_map = {}
for col in output_names:
start = len(input_names)
input_names.extend(merged_columns.get(col, [col]))
column_map[col] = slice(start, len(input_names))
for row in zip(*(data[c] for c in input_names)):
yield tuple(''.join(row[column_map[c]]) for c in output_names)
你打电话给:
list(merged_pivot(a, 'date', 'rate', 'code', 'product', code=('country code', 'area code')))
传入:
- 映射列表
- 构成输出的每一列(
'date', 'rate', 'code', 'product'
在上面的例子中)
- 输出中由输入列的合并列表组成的任何列(
code=('country code', 'area code')
在示例中,code
输出中由合并country code
和形成area code
)。
输出:
>>> list(merged_pivot(a, 'date', 'rate', 'code', 'product', code=('country code', 'area code')))
[('2012-03-09', '199', '1114', 'Mobile'), ('2012-01-12', '900', '211', 'Teddy'), ('2012-11-11', '899', '4419', 'Handbag')]
或者,稍微重新格式化:
[('2012-03-09', '199', '1114', 'Mobile'),
('2012-01-12', '900', '211', 'Teddy'),
('2012-11-11', '899', '4419', 'Handbag')]
如果您需要做的只是分别处理每一行,您也可以只循环它的输出,而不是调用生成list()
器:merged_pivot()
columns = ('date', 'rate', 'code', 'product')
for row in merged_pivot(a, *columns, code=('country code', 'area code')):
# do something with `row`
print row