连接和分组填充NaN值

时间:2017-09-08 23:30:34

标签: python pandas dataframe group-by pandas-groupby

我有这个数据框:

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
...

由于单个公司代码的名称和地址总是相同的,所以基本上我想在轴= 0中用df连接df2,并从原始df的公司代码中将这个名称和地址拉到这个新行。写作相当混乱,但我认为它在视觉上效果更好。

任何想法我怎么能这样做?

2 个答案:

答案 0 :(得分: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设置为在连接时创建新索引
  • 连接在NaN的列中留下df2以前不存在的值
  • groupby执行companycode操作,然后ffill,使用同一组中的正确值填充NaN GID UID <br> ------------ ---------------------- 178175721842183084 INC 1121035756

答案 1 :(得分:0)

对于那些使用SQL-mindsets的人,请考虑merge concatJOIN UNION}:

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