2017-02-01 3 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 

до сих пор я использовал метод .loc из pandas.DataFrame, которая возвращает индексированный месту нахождения строки, которые квалифицируют булевскую индексацию, но мне нужны значения ...

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

Я новичок в написании сценариев на питоне и не могу представить логику. Может кто-нибудь помочь, пожалуйста?

ответ

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: не может join без заданного уровня и n o совпадающие имена – kage77

+0

Хмм, 'df.columns = df.columns.str.split ('_', expand = True)' this return error? Что такое 'print (df.columns)' после этого кода? – jezrael

+0

Эта строка прекрасна, ее эта строка возвращает ошибку df2 = df1 [df1 ['OLD']! = Df1 ['NEW']] – kage77

Смежные вопросы