【问题标题】:Python Pandas to match rows with overlapping coordinatesPython Pandas 匹配具有重叠坐标的行
【发布时间】:2020-07-21 08:47:36
【问题描述】:

我是 python 新手,正在尝试使用 pandas 解决问题。

我有两个 .csv 文件已作为 pandas 数据框导入。

其中一个文件是包含 ID 号、开始和结束坐标行的文件:

ID  Start  End
1   45     99
3   27     29
6   13     23
19  11     44

我的第二个文件有一个代码列,以及开始和结束坐标:

Code  Start  End
ss13d  67    100
dfv45  55    100
aal33  101   222
mm0ww  24    28

我想找到这两个文件之间没有特定顺序重叠的开始和结束坐标,因此结果看起来像这样:

ID  Start  End  Code  Start  End
1   45     99   ss13d 67     100
1   45     99   dfv45 55     100
3   27     29   mm0ww 24     28

我尝试过使用 pandas.merge(),但据我了解,列表需要有共同的列。在这种情况下,它是我的起始列,但我无法合并这些列,因为它们是被比较的列。

现在我终于弄清楚了如何定位重叠背后的逻辑:

df = pd.read_csv (r'file1.csv')   
df2 = pd.read_csv ('file2.csv')

c= (df['Start'] <= df2['Start']) & (df['End'] >= df2['Start']) | (df['Start'] <= df2['End']) & (df['End'] >= df2['End'])

但是我没有任何运气可以工作。

有人能指出我正确的方向吗?在这种情况下,我认为 concat 和 merge 都不适合我。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    所以一开始,你应该重命名你的列,这样你就可以知道哪个属于哪个数据框,这会让以后比较它们时更容易。

    df1 = df1.rename(columns={'Start': 'Start_1', 'End': 'End_1'}) 
    df2 = df2.rename(columns={'Start': 'Start_2', 'End': 'End_2'}) 
    

    接下来,如果你想合并两个数据框,但没有任何共同的列,你可以简单地创建一个:

    df1["key"] = 0
    df2["key"] = 0
    

    然后您可以合并该列并再次删除它

    joined_df = pd.merge(df1, df2).drop(columns=['key'])
    

    最后,您可以根据重叠过滤列,例如:

    joined_df[(joined_df["Start_2"] > joined_df["Start_1"]) & (joined_df["Start_2"] < joined_df["End_1"])]
    

    (提示一下,使用&amp;| 作为二元运算符来组合过滤器,并始终在布尔值周围加上括号。)

    希望这对熊猫有帮助并祝你好运!

    【讨论】:

    • 哦,谢谢!所以从我所见,这在零位置创建了一个名为“Key”的新列,是吗?这将填充一个 NaN 值?
    • 不,它在每个数据框中创建了一个名为“key”的列,每行的值为 0。将 df1 中的每一行对“key”中的值 x 与 df2 中的每一行进行对,后者是“key”中的值 x。由于这里到处都是 x=0,我们基本上是在做一个笛卡尔积,df1 的每一行都与 df2 的每一行配对。然后我们可以过滤并丢弃任何不重叠的东西。如果您使用的是笔记本(jupyter notebook、google colab 等),您可以打印出中间步骤,以便更轻松地查看发生了什么。
    • 哦,我的上帝,非常感谢你,你太棒了!最后一个问题 - 当我尝试像这样合并时:joined_df = pd.merge(df1, df2).drop(columns=['key' ]) 它仍然说我没有要合并的通用列。也许我需要使用一些选项,比如 right=?
    • 嗯,我无法复制该错误。你可以试试df1.merge(df2,how='outer'),应该是等价的,而且你也不一定要丢“key”,只是清理,可以去掉调试。你能在合并之前检查两个dfs都有key列吗?
    • 合并过程导致我的系统死机,我猜它导致某种内存溢出。我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2011-08-02
    • 1970-01-01
    • 2020-11-20
    • 2021-07-14
    相关资源
    最近更新 更多