我有两个数据框,我想从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'
答案 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 这样的文件会导致以下结果:
从我的代码中可以看到,列名称存在“一些问题”, 我还有另一个提示:用 names = [...] 调用 read_csv 。这样你 自行指定列名称。这意味着实际的行数据 从初始行中读取。 如果要忽略此行,请传递 skiprows = 1 跳过此行。
在进行了任何这些实验之后, print(df.head())进行检查 列名称和每列中包含的数据。
另一个提示:在 read_csv 之后,仅保留 您已阅读并删除“更多”行的内容。 这样,您可以在较小部分的源数据上测试代码。
然后,您可以递增地留下更多的行并重复 您的处理。如果在此过程中发生错误, 您应该在您的最后一个“扩展部分”中查找原因 源数据。