2017-02-01 50 views
1

CSV文件的列我有一個CSV文件作爲這樣比較使用Python

ID OLD_A NEW_A OLD_B  NEW_B  OLD_C NEW_C 
1 0  0  1/1/2017 1/1/2017 ABC BCD 
2 0  0  1/1/2017 2/1/2017 ABC ABC 
3 1  2  1/1/2017 1/1/2017 ABC BCD 

我想比較A,B和C的情況下,新老列有中值的差異OLD和NEW(有10K +行),我想返回的輸出本身(從上面的例子):

ID Field_Changed OLD_Value NEW_Value 
1 C    ABC   BCD 
2 B    1/1/2017 2/1/2017 
3 A    1   2 
3 C    ABC   BCD 

到目前爲止,我已經使用pandas.DataFrame的方法的.loc返回的索引位置行布爾索引的資格,但我需要的值以及...

df.loc[(df['OLD_A'] != df['NEW_A'])].index) 

我是新來的python腳本,似乎無法找出邏輯。有人可以幫忙嗎?

回答

2

set_index創造MultiIndex通過split列名

stack和重命名列

濾波器boolean indexing

df = df.set_index('ID') 

df.columns = df.columns.str.split('_', expand=True) 
df1 = df.stack()[['OLD','NEW']].reset_index().rename(columns={'level_1':'Field_Changed'}) 
print (df1) 
    ID Field_Changed  OLD  NEW 
0 1    A   0   0 
1 1    B 1/1/2017 1/1/2017 
2 1    C  ABC  BCD 
3 2    A   0   0 
4 2    B 1/1/2017 2/1/2017 
5 2    C  ABC  ABC 
6 3    A   1   2 
7 3    B 1/1/2017 1/1/2017 
8 3    C  ABC  BCD 

print (df1.columns) 
Index(['ID', 'Field_Changed', 'OLD', 'NEW'], dtype='object') 

print (df1.index) 
RangeIndex(start=0, stop=9, step=1) 
print (df1['OLD'] != df1['NEW']) 
0 False 
1 False 
2  True 
3 False 
4  True 
5 False 
6  True 
7 False 
8  True 
dtype: bool 

df2 = df1[df1['OLD'] != df1['NEW']] 
print (df2) 
    ID Field_Changed  OLD  NEW 
2 1    C  ABC  BCD 
4 2    B 1/1/2017 2/1/2017 
6 3    A   1   2 
8 3    C  ABC  BCD 
+0

謝謝,但我似乎得到這個錯誤ValueError異常:不能加入沒有指定的級別和n o重疊名稱 – kage77

+0

嗯,'df.columns = df.columns.str.split('_',expand = True)'這個返回錯誤?此代碼之後是什麼'print(df.columns)'? – jezrael

+0

那條線很好,它的這條線返回一個錯誤df2 = df1 [df1 ['OLD']!= df1 ['NEW']] – kage77