【问题标题】:Python logic to compare two files iteratively and build parent child relation迭代比较两个文件并建立父子关系的Python逻辑
【发布时间】:2019-10-15 19:27:47
【问题描述】:

有人可以帮助我更简单的逻辑吗?这两天我一直在摸不着头脑。

问题: - 我有两个 CSV 文件。尝试建立父/子关系,直到关系耗尽两个文件。

假设,这两个文件在第一个 csv 中有 2 列 A、B,在第二个 CSV 中有 C、D 列。

“A”应该与“C”匹配,对于匹配的行[Inner Join],取“D”并与“B”比较[Again an inner join]。再说一遍,从结果来看,A 应该与“C”匹配,直到关系或链在某处停止。

基本上,在我的问题中,B 是 D 的孩子,而 B 本身可能有另一个孩子。

不确定我是否说清楚

感谢您提供帮助。我已经创建了虚拟数据。看看有没有帮助

在下面两个csv文件中输入数据

A   B            C    D
310 9000        310 8000                                                                         
320 8000        320 2000   
330 2000        330 1000
340 1000        350 2500

新文件或数据框中的预期输出:- 链停止在 1000,因为 340 在第二个 csv 中没有行。

预期输出数据:-

    A   B    C   D    E   F
1. 310 8000 320 2000 330 1000

【问题讨论】:

  • 有人可以帮我吗?
  • 嗨,Karthik。欢迎来到 Stackoverlfow :) 请查看stackoverflow.com/help/how-to-ask。然后对您的问题进行必要的更改。
  • 嗨 Mohit,感谢您调查我的问题。认为我把这个问题做得好一点。
  • 你能举一个你尝试过的例子吗?
  • 您能否添加一些虚拟数据,以便我们重现您的问题?

标签: python pandas merge


【解决方案1】:

根据我的理解,我认为这是您需要的:

df1

    A   B
0   310 9000
1   320 8000
2   330 2000

df2

     C  D
0   310 8000
1   320 2000
2   330 1000

合并 dfs:

merged_df = pd.merge(df1, df2, left_on = ['A'], right_on = ['C'])
merged_df
     A   B       C  D
0   310 9000    310 8000
1   320 8000    320 2000
2   330 2000    330 1000

假设当 B>D 时 D 是 B 的子级:

result = merged_df.loc[merged_df['B']>merged_df['D'],['C', 'D']].values.ravel()
result
array([ 310, 8000,  320, 2000,  330, 1000], dtype=int64)

将它们转换为系列:

pd.Series(result, index = list('ABCDEF'))
A     310
B    8000
C     320
D    2000
E     330
F    1000

【讨论】:

  • 感谢 Mohit 抽出时间帮助我。但在我的场景中,C 列和 D 列也可以包含字母数字字符。此外,我将有“n”个父/子关系,就像我们在输出中看到的那样
  • 哦,我明白了。您应该在问题中提及所有案例。有了相关数据就更容易理解了。
  • 是的,应该有。抱歉,我错过了那部分
  • 有人可以帮我解决这个问题吗?
猜你喜欢
  • 2014-01-11
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多