【问题标题】:Pandas giving KeyError when merging on df2.columnsPandas 在 df2.columns 上合并时给出 KeyError
【发布时间】:2019-06-17 07:54:21
【问题描述】:

我有两个数据框。第一个是空的,但定义了列:

Empty DataFrame
Columns: [ID, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157]
Index: []

第二个数据框是:

    3123    3124    3125    3126    3127
0   A       B       C       D       

稍后,我将有另一个数据框:

    3146    3147    3148    3149    3150
0   X       Y       Z           

等等。我想要的是将所有这些小数据框放在第一个中,以获得类似:

ID  3120    3121    3122    3123    3124    3125    3126    3127    3128    3129    3130    3131    3146    3147    3148    3149    3150    3151    3152    3153    3154    3155    3156    3157
1                           A       B       C       D                                               X       Y       Z

所以我在循环中所做的是:

df_main.merge(df_i, how='inner', on=df_i.columns)

在哪里,当 i=1 时:

df_main.columns:

Index(['ID', '3120', '3121', '3122', '3123', '3124', '3125', '3126',
       '3127', '3128', '3129', '3130', '3131', '3146', '3147', '3148', '3149',
       '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157'],
      dtype='object')


df_i.columns:

Index(['3123', '3124', '3125', '3126', '3127'], dtype='object')

代码引发了这个 KeyError:

    raise KeyError(key)
KeyError: Index(['3123', '3124', '3125', '3126', '3127'], dtype='object')

这怎么可能? df_i.columns包含并存在于df_main.columns

提前谢谢你!

【问题讨论】:

  • 我相信这个错误意味着pandas试图使用整个列表['3123', '3124', '3125', '3126', '3127']作为一个列名。
  • 试试这个:df_main.merge(df_i, how='inner', on=df_i.columns.tolist())。在少数情况下,columns 不能直接用作可迭代对象,这可能就是其中之一。
  • 嗨,是的,这种方式可以部分工作......我没有得到 KeyError 但结果是一个空数据框:/ 也许合并不是我想要的? :/ 谢谢

标签: python python-3.x pandas dataframe merge


【解决方案1】:

好的一种方法

df1

  3123 3124 3125 3126  3127
0    A    B    C    D   NaN

df2

  3146 3147 3148  3149  3150
0    X    Y    Z   NaN   NaN

使用pd.concat

df = pd.concat([df.drop(df1.columns.append(df2.columns),axis=1),df2,df3], sort=True, axis=1)
df = df[['ID', 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157]] # for reordering
df.fillna('', inplace=True)

输出

    ID 3120 3121 3122 3123 3124 3125 3126 3127 3128 ...  3148 3149 3150 3151  \
0                      A    B    C    D           ...     Z                  

  3152 3153 3154 3155 3156 3157  
0                                

[1 rows x 25 columns]

【讨论】:

  • 这个解决方案几乎没问题,但没有保持 df 列的顺序:/ 谢谢!
猜你喜欢
  • 2017-01-07
  • 2022-01-26
  • 1970-01-01
  • 2021-11-19
  • 2019-01-29
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多