【问题标题】:How to print dataframe difference result in row format如何以行格式打印数据帧差异结果
【发布时间】:2020-10-13 02:09:14
【问题描述】:

问题陈述根据 cmets 编辑:

1)我有两个来自不同来源的 json 文件,我正在转换为 df 并使用 numpy 进行比较,如果值有差异,则将差异判断为是或否

  1. 并且 json 文件是动态的,因此可能有一些列在 df 中都匹配,并且某些列在任何一侧都将丢失(即完全外连接)。所以意味着两个 df 可能有一个共同的列来比较,并且可能是另一侧不存在的列名。

  2. 例如在下面的示例 json 文件中,df_a 没有 Fare 列,而 df_b 有它

来自 json 的 df_a:

[
    {
        "FlightNo": "12345",
        "Airlines": "Delta"                 
    }
]

来自 json 的 df_b :

[
    {
        "FlightNo": "12345",
        "Airlines": "Delta",        
        "Fare" : "4500"         
    }
]

我尝试了什么: 4) 如果 df_a 和 df_b 中的列名在手边都是已知的,那么我正在写的东西专门与列名进行比较

    df1 = pd.merge(df_a[['FlightNo']],df_b[['FlightNo']],left_index=True,right_index=True)
    df1['diff'] = np.where((df1['FlightNo_x']==df1['FlightNo_y']),'No', 'Yes') 
        
       
    df2 = pd.merge(df_a[['Airlines']],df_b[['Airlines']],left_index=True,right_index=True)
    df2['diff'] = np.where((df2['Airlines_x']==df2['Airlines_y']),'No', 'Yes')

    df3 = pd.merge(df_a[['Fare']],df_b[['Fare']],left_index=True,right_index=True)
        df2['diff'] = np.where((df2['Fare_x']==df2['Fare_y']),'No', 'Yes')

5)电流输出:(第三行是第1行和第2行值之间的差异)

     FlightNo_x Flightno_y   Diff 
     12345      Delta        No
    
     Airlines_x Airlines_y   Diff
     Delta      Delta        No  

     Fare_x     Fare_y       Diff
     NaN        4500         Yes
  1. 现在的挑战是第一个 df_a 中不存在名为 Fare 的列,并且在 df_b 中存在,所以我不能硬编码列名来比较,df_b 有可能有多个新列,而 df_a 中不会存在.

  2. 所以有没有办法告诉熊猫,我没有像上面那样为每个比较指定列名,程序应该通过某种方式计算所有可用的列比较它并产生差异为是或否

  3. 基于第 7 点,有没有办法以以下格式输出(但我可以接受上面第 5 点或以下提到的任何输出格式

【问题讨论】:

  • row3 no no Yes 是怎么来的?
  • 我正在写类似这样的东西,但它会将 Yes 或 No 作为新列,因为它以列格式比较 x 和 y,但我希望可以按行将差异放入 row 。 .df1 = pd.merge(df_a[['FlightNo']],df_b[['FlightNo']],left_index=True,right_index=True) df1['diff'] = np.where((df1['FlightNo_x' ]==df1['FlightNo_y']),'否', '是')
  • 还有什么方法可以告诉熊猫在合并时不提及列名进行比较...假设这两个源数据帧是由其他进程生成的,我不知道有多少列在两个数据框中,我需要比较数据框中这些未知数量的列。如果我知道有明确的列,我可以根据列名合并,但如果列名是动态的,有些是普通列,有些是未知的新列,那里是比较的挑战。因为外连接需要一个键来进行外连接。需要专家建议
  • 您能否根据您希望如何生成输出来更新您的问题。它将帮助其他人研究它。
  • 肯定会这样做

标签: python json pandas dataframe


【解决方案1】:

你可以尝试这样的事情,transpose()np.where()

import pandas as pd
import numpy as  np
data=[
    {
        "FlightNo": "12345",
        "Airlines": "Delta"                 
    }
]


data2=[
    {
        "FlightNo": "12345",
        "Airlines": "Delta",        
        "Fare" : "4500"         
    }
]
df1=pd.DataFrame(data)
df2=pd.DataFrame(data2)
print(df1)
df=pd.concat([df1,df2],ignore_index=True).transpose()
df[2]=np.where(df[0]==df[1],'No','Yes')
df=df.T
print(df)

输出:

df
      FlightNo Airlines  Fare
    0    12345    Delta   NaN
    1    12345    Delta  4500
    2       No       No   Yes

【讨论】:

    【解决方案2】:

    假设您能够将 JSON 放入一个数据帧中,那么您可以执行以下操作。

    输入:

        FlightNo    Airlines    Fare
    0   12345       Delta       Nan
    1   12345       Delta       4500
    

    代码(遍历列并将值分配给新的数据框,然后追加):

    df1 = pd.DataFrame({'FlightNo' : ['1'], 'Airlines' : ['2'], 'Fare' : ['3']})
    for i in range(len(df.columns)):
        if df.iloc[0,i-1] == df.iloc[1,i-1]:
            df1.iloc[0,i-1] = 'No'
        else:
            df1.iloc[0,i-1] = 'Yes'
    df = df.append(df1)
    df
    

    输出:

        FlightNo    Airlines    Fare
    0   12345       Delta       Nan
    1   12345       Delta       4500
    0   No          No          Yes
    

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 2022-08-06
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多