回答編集履歴

3

d

2019/02/25 03:16

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -160,6 +160,4 @@
160
160
 
161
161
  +,13101,101,1010047,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,5
162
162
 
163
- +,13101,101,1010041,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,5
164
-
165
163
  ```

2

d

2019/02/25 03:16

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -96,25 +96,37 @@
96
96
 
97
97
 
98
98
 
99
- before = pd.read_csv('before.csv', header=None)
99
+ # CSV を読み込む
100
100
 
101
+ before = pd.read_csv('before.txt', header=None)
102
+
101
- after = pd.read_csv('after.csv', header=None)
103
+ after = pd.read_csv('after.txt', header=None)
102
104
 
103
105
 
104
106
 
105
- # 一致しない行を抽出する。
107
+ # 左結合
106
108
 
107
- diff_rows = (before != after).any(axis=1)
109
+ diff_before = before.merge(after, indicator=True, how='left').loc[lambda x : x['_merge'] != 'both']
108
110
 
109
- # 一致しない行を交互に結合
111
+ diff_after = after.merge(before, indicator=True, how='left').loc[lambda x : x['_merge'] != 'both']
110
112
 
111
- diff = pd.concat([before[diff_rows], after[diff_rows]]
112
113
 
113
- ).sort_index(kind='merge')
114
114
 
115
- # -+ のマーカーを先頭列に挿入する。
115
+ # マーカー挿入
116
116
 
117
+ diff_before.insert(0, 'marker', '-')
118
+
117
- diff.insert(0, 'marker', np.tile(['-', '+'], diff_rows.sum()))
119
+ diff_after.insert(0, 'marker', '+')
120
+
121
+
122
+
123
+ # 交互に結合する。
124
+
125
+ diff = pd.concat([diff_before, diff_after]).sort_index(kind='merge')
126
+
127
+ # _merge 列を削除
128
+
129
+ diff.drop(columns=['_merge'], inplace=True)
118
130
 
119
131
 
120
132
 
@@ -134,8 +146,6 @@
134
146
 
135
147
 
136
148
 
137
-
138
-
139
149
  ```python
140
150
 
141
151
  -,13101,102,1020072,トウキョウト,チヨダク,イイダバシ,東京都,千代田区,飯田橋,0,0,1,0,0,0
@@ -150,4 +160,6 @@
150
160
 
151
161
  +,13101,101,1010047,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,5
152
162
 
163
+ +,13101,101,1010041,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,5
164
+
153
165
  ```

1

d

2019/02/25 03:16

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -65,3 +65,89 @@
65
65
  13
66
66
 
67
67
  ```
68
+
69
+
70
+
71
+ ## 追記
72
+
73
+
74
+
75
+ pandas だけで同じような出力をするなら以下のようになります。
76
+
77
+
78
+
79
+ 1. 一致しない行を抽出する。
80
+
81
+ 2. 一致しない行を交互にマージする。
82
+
83
+
84
+
85
+
86
+
87
+ ```python
88
+
89
+ import csv
90
+
91
+ from io import StringIO
92
+
93
+
94
+
95
+ import pandas as pd
96
+
97
+
98
+
99
+ before = pd.read_csv('before.csv', header=None)
100
+
101
+ after = pd.read_csv('after.csv', header=None)
102
+
103
+
104
+
105
+ # 一致しない行を抽出する。
106
+
107
+ diff_rows = (before != after).any(axis=1)
108
+
109
+ # 一致しない行を交互に結合
110
+
111
+ diff = pd.concat([before[diff_rows], after[diff_rows]]
112
+
113
+ ).sort_index(kind='merge')
114
+
115
+ # -+ のマーカーを先頭列に挿入する。
116
+
117
+ diff.insert(0, 'marker', np.tile(['-', '+'], diff_rows.sum()))
118
+
119
+
120
+
121
+ # DataFrame を出力する。
122
+
123
+ ofs = StringIO()
124
+
125
+ diff.to_csv(ofs, index=False, header=False)
126
+
127
+ output = ofs.getvalue()
128
+
129
+
130
+
131
+ print(output)
132
+
133
+ ```
134
+
135
+
136
+
137
+
138
+
139
+ ```python
140
+
141
+ -,13101,102,1020072,トウキョウト,チヨダク,イイダバシ,東京都,千代田区,飯田橋,0,0,1,0,0,0
142
+
143
+ +,13101,102,1020082,トウキョウト,チヨダク,イチバンチョウ,東京都,千代田区,一番町,0,0,0,0,0,0
144
+
145
+ -,13101,101,1010032,トウキョウト,チヨダク,イワモトチョウ,東京都,千代田区,岩本町,0,0,1,0,0,0
146
+
147
+ +,13101,101,1010035,トウキョウト,チヨダク,イワモトチョウ,東京都,千代田区,岩本町,0,0,1,0,0,0
148
+
149
+ -,13101,101,1010047,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,0
150
+
151
+ +,13101,101,1010047,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田,0,0,1,0,0,5
152
+
153
+ ```