【发布时间】:2020-10-13 02:09:14
【问题描述】:
问题陈述: 根据 cmets 编辑:
1)我有两个来自不同来源的 json 文件,我正在转换为 df 并使用 numpy 进行比较,如果值有差异,则将差异判断为是或否
-
并且 json 文件是动态的,因此可能有一些列在 df 中都匹配,并且某些列在任何一侧都将丢失(即完全外连接)。所以意味着两个 df 可能有一个共同的列来比较,并且可能是另一侧不存在的列名。
-
例如在下面的示例 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
-
现在的挑战是第一个 df_a 中不存在名为 Fare 的列,并且在 df_b 中存在,所以我不能硬编码列名来比较,df_b 有可能有多个新列,而 df_a 中不会存在.
-
所以有没有办法告诉熊猫,我没有像上面那样为每个比较指定列名,程序应该通过某种方式计算所有可用的列比较它并产生差异为是或否
-
基于第 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