合并数据框中的单个列时出现Keyerror问题

时间:2019-06-22 13:14:30

标签: python pandas

我有两个数据框,我想从dataframe2到dataframe1中添加一列。当我使用dataframe1.merge(dataframe2, on = 'Name')合并它们时,它可以工作,但不添加任何列。当我使用dataframe1.merge(dataframe2['AvgUnitPrice'], on = 'Name')时,它会给我KeyError problem with 'Name'

尝试了不同的方法,例如

dataframe1 = dataframe1.merge(dataframe2[list(prices_df)[2]], left_on = 'Name', right_on = 'Name')

仍然没有用。还要用''代替dataframe1内部的所有空格。 还检查了两者的dtype,它们都是对象。

base_df = pd.read_csv(base_dataset_path, encoding = 'ISO-8859-1')
prices_df = pd.read_csv(prices_dataset_path, encoding = 'ISO-8859-1')

#Renaming no name columns 
base_df.rename(columns = {list(base_df)[1] : 'Categories', list(base_df)[2] : 'Name'}, inplace = True)

prices_df.rename(columns = {list(prices_df)[2] : 'AvgUnitPrice'}, inplace = True)

prices_df.rename(columns = {list(prices_df)[1] : 'Name'}, inplace = True)

#replacing white spaces
prices_df['Name'] = prices_df['Name'].str.replace(' ', '')

base_df['Name'] = base_df['Name'].str.replace(' ','')

#Merge
base_df = base_df.merge(prices_df[list(prices_df)[2]], left_on = 'Name', right_on = 'Name')

预期投放:

dataframe1 merged with dataframe2 only with column AvgUnitPrice on 'Name'

结果:

KeyError 'Name' ##The right_on = 'Name'

1 个答案:

答案 0 :(得分:0)

在代码示例中,您编写了 #Renameing no name columns

这与您使用 read_csv 的方式相矛盾。 由于您未传递 header names 参数, read_csv 执行有关列名称的默认变体 设置,即 names-'infer',即它尝试从中读取它们 第一行输入。

因此,我不同意您的假设,即这些列没有没有名称。 如果它们确实没有名称,则重命名它们的尝试将失败。

还请注意,list(base_df)给出列名作为列表,但列号为 从0开始,因此list(base_df)[1]给出了第二列的名称。

因此,使用“从1开始”的列编号,您将第二第三重命名 列到类别名称。这就是你想要的吗?

我建议在合并之前添加到您的代码中:

print(base_df.columns, prices_df.columns)

所以您将知道什么是实际的列名。

甚至更好:打印 base_df.head() prices_df.head(),这样 在表中将同时具有列名和初始行的内容。

也许,基于此打印输出,您会在自己的书中发现一些奇怪的东西 DataFrames?

有时候,源文件没有“列名行”, 但从实际数据行开始。 尝试以您的方式 read_csv 这样的文件会导致以下结果:

  • 数据行的内容用作列名(结果 通常是无法预测的),
  • DataFrame中的实际数据从 second 输入行开始。

从我的代码中可以看到,列名称存在“一些问题”, 我还有另一个提示:用 names = [...] 调用 read_csv 。这样你 自行指定列名称。这意味着实际的行数据 从初始行中读取。 如果要忽略此行,请传递 skiprows = 1 跳过此行。

在进行了任何这些实验之后, print(df.head())进行检查 列名称和每列中包含的数据。

另一个提示:在 read_csv 之后,仅保留 您已阅读并删除“更多”行的内容。 这样,您可以在较小部分的源数据上测试代码。

然后,您可以递增地留下更多的行并重复 您的处理。如果在此过程中发生错误, 您应该在您的最后一个“扩展部分”中查找原因 源数据。