【问题标题】:Python pandas join dataframes on unordered index failingPython pandas 在无序索引失败时加入数据帧
【发布时间】:2018-07-29 17:12:59
【问题描述】:

我有两个从我想要加入的 csv 文件中读取的 Pandas 数据帧。两者都有一个我设置为索引的 ID 列。然后我只是根据索引加入它们。 不幸的是,当我这样做并且第二个 df 的索引与第一个 df 的顺序不同时,它会失败。 例如:

>>> print df1
                A     B
ID                                                                         
004583404.1_1   CYT   NaN
005874764.1_2   CYT   NaN
004583406.1_3   TMH   NaN
005873538.1_36  SpII  cleavage=18-19
005873971.1_57  SpII  cleavage=18-19

>>> print df2
                LipoBoxSimilarity OM/IM  Cleavage site
Sequence name                                        
005873971.1_57              High    OM             19
005873538.1_36              High    OM             19

>>> print df1.join(df2)
                A     B     LipoBoxSimilarity OM/IM  Cleavage site
ID                                                                         
004583404.1_1   CYT   NaN                 NaN   NaN            NaN
005874764.1_2   CYT   NaN                 NaN   NaN            NaN
004583406.1_3   TMH   NaN                 NaN   NaN            NaN
005873538.1_36  SpII  cleavage=18-19     High    OM             19
005873971.1_57  SpII  cleavage=18-19     High    OM             19

当我合并这两个 df 时,它仍然有效。然后,当我使用实际文件作为输入(只有更多行)时,它不再起作用。 两个 df 分别正确构建并且索引适当,列也合并,但不是值。所以我最终处于这种情况:

>>> print df1.join(df2)
                A     B     LipoBoxSimilarity OM/IM  Cleavage site
ID                                                                         
004583404.1_1   CYT   NaN                 NaN   NaN            NaN
005874764.1_2   CYT   NaN                 NaN   NaN            NaN
004583406.1_3   TMH   NaN                 NaN   NaN            NaN
005873538.1_36  SpII  cleavage=18-19      NaN   NaN            NaN
005873971.1_57  SpII  cleavage=18-19      NaN   NaN            NaN

可能的原因是什么?我在与索引顺序相关的文档中找不到任何问题。字母数字索引可能是个问题(例如 WP_004583404.1_1)?我当然也尝试过基于列合并(所以没有将它们设置为索引),但它也不起作用。

【问题讨论】:

  • 检查这个答案,https://stackoverflow.com/questions/30045086/pandas-left-join-and-update-existing-column
  • 问题出在其中一个文件中。由于 ID 是一个字符串/对象,它们必须完美匹配,但是在“ID”列的每个值的末尾都有一个空格,因此索引实际上是不同的。一个简单的df1.join(df2) 有效。我想我应该删除这个问题,因为它有点“错误”。

标签: python pandas dataframe join merge


【解决方案1】:

试试combine_first。请注意,我已经在 2 个数据框之间对齐了公共列名 ('ID')。

import pandas as pd
from numpy import *

df1 = pd.DataFrame.from_dict({'A': {0: 'CYT', 1: 'CYT', 2: 'TMH', 3: 'SpII', 4: 'SpII'},
                              'B': {0: nan, 1: nan, 2: nan, 3: 'cleavage=18-19', 4: 'cleavage=18-19'},
                              'ID': {0: '004583404.1_1',
                                     1: '005874764.1_2',
                                     2: '004583406.1_3',
                                     3: '005873538.1_36',
                                     4: '005873971.1_57'}})

df2 = pd.DataFrame.from_dict({'Cleavage site': {0: 19, 1: 19},
                              'LipoBoxSimilarity': {0: 'High', 1: 'High'},
                              'OM/IM': {0: 'OM', 1: 'OM'},
                              'ID': {0: '005873971.1_57', 1: '005873538.1_36'}})

df1.combine_first(df2)

#       A               B  Cleavage site              ID LipoBoxSimilarity OM/IM
# 0   CYT             NaN           19.0   004583404.1_1              High    OM
# 1   CYT             NaN           19.0   005874764.1_2              High    OM
# 2   TMH             NaN            NaN   004583406.1_3               NaN   NaN
# 3  SpII  cleavage=18-19            NaN  005873538.1_36               NaN   NaN
# 4  SpII  cleavage=18-19            NaN  005873971.1_57               NaN   NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2014-07-10
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多