使用Python比较CSV文件的列

时间:2017-02-01 06:47:55

标签: python csv pandas dataframe compare

我有一个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脚本的新手,似乎无法弄清楚逻辑。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

set_index并按split列名称

创建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