如何在一个DataFrame中合并字符串

时间:2019-04-26 13:16:15

标签: python python-3.x pandas dataframe

我正在处理入站用户数据。我收到DataFrame h,应该包含所有float但有一些字符串:

>>> h = pd.DataFrame(np.random.rand(3, 2), columns=['a', 'b'])
>>> h.loc[0, 'a'] = 'bad'
>>> h.loc[1, 'b'] = 'robot'
>>> h
           a           b
0        bad    0.747314
1   0.921919       robot
2   0.754256    0.664455

我处理并将字符串设置为np.nan(我意识到np.nanfloat,但这只是为了说明):

>>> hh = h.copy()
>>> hh.loc[0, 'a'] = np.nan
>>> hh.loc[1, 'b'] = np.nan
>>> hh
           a           b
0        NaN    0.747314
1   0.921919         NaN
2   0.754256    0.664455

我有一个期望值的DataFrame(或dict):

>>> g = pd.DataFrame({'a': ['foo'], 'b': ['bar']}, index=h.index)
>>> g
      a       b
0   foo     bar
1   foo     bar
2   foo     bar

我用来填充错误数据的位置。

>>> hh.fillna(g)
          a           b
0        foo    0.747314
1   0.921919         bar
2   0.754256    0.664455

我还需要包含预期数据。所以结果应该是:

>>> magic(hh, g)
                   a                     b
0   rec=bad; exp=foo              0.747314
1           0.921919    rec=robot; exp=bar
2           0.754256              0.664455

如何创建这样的结果?

1 个答案:

答案 0 :(得分:5)

您可以通过DataFrame.where将不必要的值转换为NaN,并与string结合在一起并最后替换原始值:

m = hh.isna()
df = ('rec=' + h.where(m) + '; exp=' + g.where(m)).fillna(h)
print (df)
                  a                   b
0  rec=bad; exp=foo            0.440508
1          0.525949  rec=robot; exp=bar
2          0.337586            0.414336