我有一个CSV文件
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脚本的新手,似乎无法弄清楚逻辑。有人可以帮忙吗?
答案 0 :(得分:2)
MultiIndex
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