'columns'をマージする一般的なメソッド。どの列を予期し、何を前もってマージするかを指定できます。
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