首页 > 解决方案 > pd.DataFrame.drop 导致创建附加列

问题描述

语境

我有一个主数据集数据框(df我从导入中清理。我用来执行此操作的代码是:

df = pd.read_excel("spots.xlsx")

此数据帧的标头如下:

Station Day Date Time Daypart

我有另一个数据框(df_chan我将其用作我的“查找”表,其中包含以下标题:

Station Sales House

我想合并这两个,以便用查找 df 中的列替换Station主 df 中的列。Sales House我知道我需要合并这些数据集,然后删除原始Station列并将列移动Sales House到第一个索引。

现在,当我使用下面的代码合并数据集时,它合并得很好。

df = pd.merge(df, df_chan, on="Station", how="inner")

以上产生以下标题:

Station Day Date Time Daypart Sales House

正如预期的那样。但是,当我应用该df.drop()方法时:

df = df.drop(columns=['Station'])

它返回的标题如下:

Day Date Time Daypart Sales House_x Sales House_y

如您所见,它正在拆分Sales House列。

问题

为什么会Sales House分裂?解决方法是什么?

如果这有点难以理解,我深表歉意 - 我已尽力解释!

编辑

从数据框中添加一些行以获得更好的上下文。

df合并前

Out[35]:
    Station Day Date    Time    Daypart
3   CARLTON Mon 3AUG20  1213    DAYTIME
4   CARLTON Mon 3AUG20  2307    POSTPEAK
5   CARLTON Tue 4AUG20  1015    COFFEE
6   CARLTON Tue 4AUG20  1027    COFFEE
7   CARLTON Wed 5AUG20  1310    DAYTIME

df_chan合并前

Out[36]:
    Station Sales House
0   4MUSIC  C4 OWN
1   4SEVEN  C4
2   5SELECT SKY
3   5STAR   SKY
4   5STAR+1 SKY

df合并后

Out[37]:
    Station Day Date    Time    Daypart     Sales House
0   CARLTON Mon 3AUG20  1213    DAYTIME     CARLTON
1   CARLTON Mon 3AUG20  2307    POSTPEAK    CARLTON
2   CARLTON Tue 4AUG20  1015    COFFEE      CARLTON
3   CARLTON Tue 4AUG20  1027    COFFEE      CARLTON
4   CARLTON Wed 5AUG20  1310    DAYTIME     CARLTON

df.drop()

Out[38]:
    Day Date    Time    Daypart   Sales House_x Sales House_y
0   Mon 3AUG20  1213    DAYTIME   CARLTON       CARLTON
1   Mon 3AUG20  2307    POSTPEAK  CARLTON       CARLTON
2   Tue 4AUG20  1015    COFFEE    CARLTON       CARLTON
3   Tue 4AUG20  1027    COFFEE    CARLTON       CARLTON
4   Wed 5AUG20  1310    DAYTIME   CARLTON       CARLTON

标签: pythonpandasdataframe

解决方案


这可能是 pd 的一个错误。问题跟踪器中有几个数据框视图与复制错误,这可能会导致您的问题。项目3048433438似乎在某种程度上准确地跟踪了您所看到的问题。

当您在示例代码中创建数据框时,df它会作为赋值变量反复循环使用。鉴于这种行为,合并似乎没有正确删除重复的sales_house列,这可能是由于 pandas 处理删除的方式inplace=True与否。

如果您希望您的代码“正常工作”,有 2 个选项

  1. 更新到 pandas > 1.0
  2. 为您的分配使用新的变量名称(df2,df3等与仅使用df

推荐阅读