我有这样的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脚本的新手,似乎无法弄清楚逻辑。有人可以帮忙吗?
set_index
并建立MultiIndex
由split
列名
stack
并重命名列
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句