【问题标题】:Compare columns of a CSV file using Python使用 Python 比较 CSV 文件的列
【发布时间】:2017-02-01 06:47:55
【问题描述】:

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

【问题讨论】:

    标签: python csv pandas dataframe compare


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,但我似乎收到了这个错误 ValueError: cannot join with no level specified and nooverlapping names
    • 嗯,df.columns = df.columns.str.split('_', expand=True) 这个返回错误?这段代码后面的print (df.columns) 是什么?
    • 那行没问题,就是这行返回错误 df2 = df1[df1['OLD'] != df1['NEW']]
    • 你确定吗?因为似乎错误在df1 = df.stack() 中。你能测试一下吗?
    • 是的,我敢肯定, df2 = df1[df1['OLD'] != df1['NEW']] 似乎出现了错误。对此感到抱歉,非常感谢您的帮助。还有什么我可以做的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多