加入字符串时,熊猫合并导致丢失的行

Cha*_*esD 2 python string merge dataframe pandas

我有一个我一直在清理的数据集,为了清理它,我需要将它放入数据透视表中以汇总一些数据。我现在将它放回数据帧中,以便我可以将它与其他一些数据帧合并。df1 看起来像这样:

    Count   Region              Period      ACV  PRJ
    167     REMAINING US WEST   3/3/2018    5    57
    168     REMAINING US WEST   3/31/2018   10   83
    169     SAN FRANCISCO       1/13/2018   99   76
    170     SAN FRANCISCO       1/20/2018   34   21
Run Code Online (Sandbox Code Playgroud)

df2 看起来像这样:

Count  MKTcode  Region
11     RSMR0    REMAINING US SOUTH
12     RWMR0    REMAINING US WEST
13     SFR00    SAN FRANCISCO
Run Code Online (Sandbox Code Playgroud)

我尝试将它们与以下代码合并:

df3 = pd.merge(df1, df2, on='Region', how='inner')
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,pandas 没有将 Region 列解释为相同的数据,并且合并会在 MKTcode 列中显示 NaN 数据,并且似乎将 df2 附加到 df1,如下所示:

Count  Region             Period    ACV             PRJ         MKTcode
193 WASHINGTON, D.C.    3/3/2018    36               38             NaN
194 WASHINGTON, D.C.    3/31/2018   12                3             NaN
195 ATLANTA              NaN        NaN             NaN           ATMR0
196 BOSTON               NaN        NaN             NaN           B2MRN
Run Code Online (Sandbox Code Playgroud)

我尝试过内部和外部连接,但真正的问题似乎是 Pandas 将每个数据框的 Region 列解释为不同的元素。df2 中的 MKTcode 列和 Region 列只有 12 个观察值,并且每个观察值仅出现一次,而 df1 在 Region 列中具有多个重复实例(同一城市的倍数)。有没有一种方法可以让我创建一个我需要的 12 个 MKTcodes 的列表,并在它与我指定的每个区域匹配的地方执行合并?像一对多的比赛?

谢谢。

cs9*_*s95 6

当合并未按预期工作时,首先要做的是查看有问题的列。

大多数情况下最大的罪魁祸首是尾随/前导空格。这些通常是在从文件中错误读取数据帧时引入的。

尝试通过剥离它们来摆脱额外的空白字符。假设您需要加入“区域”列,请使用

for df in (df1, df2):
    # Strip the column(s) you're planning to join with
    df['Region'] = df['Region'].str.strip()
Run Code Online (Sandbox Code Playgroud)

现在,合并应该按预期工作,

pd.merge(df1, df2, on='Region', how='inner')

   Count_x             Region     Period  ACV  PRJ  Count_y MKTcode
0      167  REMAINING US WEST   3/3/2018    5   57       12   RWMR0
1      168  REMAINING US WEST  3/31/2018   10   83       12   RWMR0
2      169      SAN FRANCISCO  1/13/2018   99   76       13   SFR00
3      170      SAN FRANCISCO  1/20/2018   34   21       13   SFR00
Run Code Online (Sandbox Code Playgroud)

如果您仍然得到 NaN,另一种可能性可能是因为words之间的空白字符不同。例如,'REMAINING US WEST'不会与 比较为相等'REMAINING US WEST'

这一次,修复方法是使用str.replace

for df in (df1, df2):
    df['Region'] = df['Region'].str.replace(r'\s+', ' ')
Run Code Online (Sandbox Code Playgroud)

  • 你也可以(可能)做一些通用的事情,比如:`df1.select_dtypes(object).applymap(str.strip).ne(df1.select_dtypes(object))`来获取这些项目的掩码 (2认同)