

pythonを使用して２つのcsvファイルを一つにまとめたいと考えております。

【list1】  
route_node,X,Y  
50775,-7882.7599,-43837.4058  
50774,-7886.58284,-43851.12686  
50772,-7895.8552,-43835.9677

【list2】  
id,x,y  
57136,-10171.54496,-44468.08496  
31001,-10798.00999,-47051.58

上記のように【list1】と【list2】があった時に  
listを一つにまとめ、

【new_list】  
route_node,X,Y,id,x,y  
50775,-7882.7599,-43837.4058,57136,-10171.54496,-44468.08496  
50775,-7882.7599,-43837.4058,31001,-10798.00999,-47051.58  
50774,-7886.58284,-43851.12686,57136,-10171.54496,-44468.08496  
50774,-7886.58284,-43851.12686,31001,-10798.00999,-47051.58  
・  
・  
・  
といったように【list1】のすべてのidに対して【list2】のすべてのroute_nodeを合わせるには  
どのような関数を使えばよろしいのでしょうか。  
"merge"を使おうかと思ったのですが、"merge"は２つのデータに共通の値がある時に使用するという認識であり、今回の場合には"merge"は使用できないのではないかと思っております。

初歩的な内容で申し訳ございませんが、ご教授いただけましたら幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-11-25T08:37:44.830
60823
2019-11-25T12:19:22.407
36305
question
python pandas numpy csv
pythonを使用して複数のcsvデータを操作


一時的に「データに共通の値」(以下では `key` カラム)を作成して、outer join します。

[code]

    >>> import pandas as pd
    >>> df1 = pd.read_csv('list1.csv')
    >>> df2 = pd.read_csv('list2.csv') 
    >>> df1.assign(key=0).merge(df2.assign(key=0), how='outer').\
        drop(columns='key').to_csv('new_list.csv', index=False)
    
    $ cat new_list.csv
    route_node,X,Y,id,x,y
    50775,-7882.7599,-43837.4058,57136,-10171.54496,-44468.08496
    50775,-7882.7599,-43837.4058,31001,-10798.00999,-47051.58
    50774,-7886.582840000001,-43851.126860000004,57136,-10171.54496,-44468.08496
    50774,-7886.582840000001,-43851.126860000004,31001,-10798.00999,-47051.58
    50772,-7895.8552,-43835.9677,57136,-10171.54496,-44468.08496
    50772,-7895.8552,-43835.9677,31001,-10798.00999,-47051.58
    
[/code]


CC BY-SA 4.0
2019-11-25T09:21:59.637
60826
2019-11-25T09:32:07.140
2019-11-25T09:32:07.140
60823
answer


主な処理をこの`itertools.product()`で出来そうです。  
[Pythonで複数のリストの直積（デカルト積）を生成するitertools.product](https://note.nkmk.me/python-
itertools-product/)  
[itertools.product - return list instead of
tuple](https://stackoverflow.com/q/22883348/9014308)

入出力は`csv`なんで面倒ですが。それとこの辺のリスト処理を使って。  
[5.1.
リスト型についてもう少し](https://docs.python.org/ja/3/tutorial/datastructures.html#more-
on-lists)  
[Python 3 で flatten
する方法いろいろ](https://qiita.com/hoto17296/items/e1f80fef8536a0e5e7db)

[code]

    import csv
    import itertools
    
    list1 = []
    with open('list1.csv', 'r', newline='') as f:
        reader = csv.reader(f)
        for row in reader:
            list1.append(row)
    
    list2 = []
    with open('list2.csv', 'r', newline='') as f:
        reader = csv.reader(f)
        for row in reader:
            list2.append(row)
    
    header = list1.pop(0)
    header.extend(list2.pop(0))
    
    list3 = [sum(list(tup), []) for tup in itertools.product(list1, list2)]
    list3.insert(0, header)
    
    with open('list3.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(list3)
    
[/code]


CC BY-SA 4.0
2019-11-25T12:19:22.407
60830
2019-11-25T12:19:22.407
26370
60823
answer