连接和分组填充NaN值

3

I have this dataframe:

df:
companycode    name    address    A     B     C     ...
1234           asd     qwe,56     Tyh   123   923
1234           asd     qwe,56     Zfhs  4828  01992
6472           yui     iop,56     Retgh 8484  8484
...

我还有一个看起来像这样的:

df2:
companycode    A     B     C       ...
1234           Jid   4123  141
6472           Low   1312  3234
...

对于一个单一的公司代码,名称和地址始终保持不变

我希望以一种连接或合并的方式将它们连接起来,最终看起来像这样:

companycode    name    address    A     B     C     ...
1234           asd     qwe,56     Tyh   123   923
1234           asd     qwe,56     Zfhs  4828  01992
6472           yui     iop,56     Retgh 8484  8484
1234           asd     qwe,56     Jid   4123  141
6472           yui     iop,56     Low   1312  3234
...

由于单个公司代码的名称和地址始终相同,因此基本上我想在axis=0上将df2与df连接起来,并从原始df的公司代码中提取名称和地址到这些新行。虽然很难描述,但我认为在视觉上更好理解。

你有什么想法吗?

2个回答

3

pd.concat 后跟一个 groupby 操作即可。

df = pd.concat([df1, df2], 0, ignore_index=True)\
                          .groupby('companycode').ffill()
df

       A     B     C address  companycode name
0    Tyh   123   923  qwe,56         1234  asd
1   Zfhs  4828  1992  qwe,56         1234  asd
2  Retgh  8484  8484  iop,56         6472  yui
3    Jid  4123   141  qwe,56         1234  asd
4    Low  1312  3234  iop,56         6472  yui

  • ignore_index=True被设置以在连接时创建一个新的索引。
  • 连接操作会使得df2中之前不存在的列的数值变成NaN
  • companycode进行groupby操作,然后使用ffill来填充同一组中正确的值,以填补NaN值。

0
对于那些具有 SQL 思维的人来说,可以考虑使用 concat 进行 merge(即使用 UNION 进行 JOIN):
mdf = df1[['companycode', 'name', 'address']]\ 
              .merge(df2, on='companycode').drop_duplicates()
finaldf = pd.concat([df1, mdf]).reset_index(drop=True)

print(finaldf)
#    companycode name address      A     B     C
# 0         1234  asd  qwe,56    Tyh   123   923
# 1         1234  asd  qwe,56   Zfhs  4828  1992
# 2         6472  yui  iop,56  Retgh  8484  8484
# 3         1234  asd  qwe,56    Jid  4123   141
# 4         6472  yui  iop,56    Low  1312  3234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接