0

私はPythonに比較的慣れていないので、それを使用して、4つの列を含む2つの並べ替えられたファイルをマージしようとしています:

ファイル 1:

x-coordinate, y-coordinate, data 1, data 2  
1, 10, 20, 0  
5, 15, 1, 2  
...

ファイル 2:

x-coordinate, y-coordinate, data 3, data 4  
1, 10, 7, 8  
3, 25, 1, 2  
...

一意の (x,y) 座標の各セットを含む 6 つの列を持つ単一の並べ替えられたファイルに変換します。

x-coordinate, y-coordinate, data 1, data 2, data 3, data 4  
1, 10, 20, 0, 7, 8  
3, 25, 0, 0, 1, 2  
5, 15, 1, 2, 0, 0  

出力ファイルの順序だけが重要でなければ、このタスクは辞書を使用して簡単になると思います。私の入力ファイルは数百行の長さであるため、重複したケース (つまり、同じ (x,y) 座標が両方のファイルに存在する場合) を処理する効率的な「pythonic」方法を考え出そうとしていますが、これまでのところ私は困惑しています。

ありとあらゆる助けをいただければ幸いです。前もって感謝します!

4

2 に答える 2

3

私はおそらくdefaultdict次のようなものに a を使用します:

from collections import defaultdict
from itertools import chain   

d = defaultdict(lambda:[0,0,0,0])
with open('file1') as f1, open('file2') as f2:
    next(f1) #get rid of header info
    next(f2)
    for line1,line2 in zip(f1,f2):
        data1 = [int(x) for x in line1.split(',')]
        data2 = [int(x) for x in line2.split(',')]
        d[tuple(data1[:2])][:2] = data1[2:]
        d[tuple(data2[:2])][2:] = data2[2:]

#now sort the items and write them out:
#This puts them in stdout, but you could easily use `file.write` here.
for k,v in sorted(d.items()):
    print(', '.join(str(x) for x in chain(k,v)))
于 2013-04-01T16:55:16.800 に答える
2

パンダの使用:

import pandas as pd

df1 = pd.read_csv("coord1.csv")
df2 = pd.read_csv("coord2.csv")
combined = df1.merge(df2, how='outer').fillna(0)
combined.sort(list(combined.columns[:2]), inplace=True)
combined.to_csv("coord_merged.csv",index=False)

まず、元のデータを読み込みます。

>>> import pandas as pd
>>> df1 = pd.read_csv("coord1.csv")
>>> df2 = pd.read_csv("coord2.csv")
>>> df1
   x-coordinate   y-coordinate   data 1   data 2
0             1             10       20        0
1             5             15        1        2
>>> df2
   x-coordinate   y-coordinate   data 3   data 4  
0             1             10        7          8
1             3             25        1          2

それらをマージし、欠落しているデータをゼロで埋めます:

>>> combined = df1.merge(df2, how='outer')
>>> combined
   x-coordinate   y-coordinate   data 1   data 2   data 3   data 4  
0             1             10       20        0        7          8
1             5             15        1        2      NaN        NaN
2             3             25      NaN      NaN        1          2
>>> combined = df1.merge(df2, how='outer').fillna(0)
>>> combined
   x-coordinate   y-coordinate   data 1   data 2   data 3   data 4  
0             1             10       20        0        7          8
1             5             15        1        2        0          0
2             3             25        0        0        1          2

選別:

>>> combined.sort(list(combined.columns[:2]), inplace=True)
>>> combined
   x-coordinate   y-coordinate   data 1   data 2   data 3   data 4  
0             1             10       20        0        7          8
2             3             25        0        0        1          2
1             5             15        1        2        0          0

そして最後に次のように書きます。

>>> combined.to_csv("coord_merged.csv",index=False)
>>> !cat coord_merged.csv
x-coordinate, y-coordinate, data 1, data 2, data 3, data 4  
1.0,10.0,20.0,0.0,7.0,8.0
3.0,25.0,0.0,0.0,1.0,2.0
5.0,15.0,1.0,2.0,0.0,0.0

整数形式を維持することが重要な場合は、

>>> combined.astype(int).to_csv("coord_merged.csv",index=False)
>>> !cat coord_merged.csv
x-coordinate, y-coordinate, data 1, data 2, data 3, data 4  
1,10,20,0,7,8
3,25,0,0,1,2
5,15,1,2,0,0

それをするでしょう。

于 2013-04-01T17:06:35.943 に答える