読者です 読者をやめる 読者になる 読者になる

<Python, pandas> 複数カラムの各要素の文字列の値をそれぞれ結合する。

pandas Python

複数カラムcolumnの各要素each elementの文字列の値string valueを、
それぞれ結合する。

In [86]: df5
Out[86]: 
   a   b     c
0  1   2     5
1  2   4  hoge
2  3   6     8
3  4   8     9
4  5  10    10

In [87]: df5['d'] = df5[['a','b']].apply(lambda x: '_'.join(x), axis=1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-89-0d4dec20f2e7> in <module>()
----> 1 df5['d'] = df5[['a','b']].apply(lambda x: '_'.join(x), axis=1)

C:\Anaconda3\Lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
   3970                     if reduce is None:
   3971                         reduce = True
-> 3972                     return self._apply_standard(f, axis, reduce=reduce)
   3973             else:
   3974                 return self._apply_broadcast(f, axis)

C:\Anaconda3\Lib\site-packages\pandas\core\frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
   4062             try:
   4063                 for i, v in enumerate(series_gen):
-> 4064                     results[i] = func(v)
   4065                     keys.append(v.name)
   4066             except Exception as e:

<ipython-input-89-0d4dec20f2e7> in <lambda>(x)
----> 1 df5['d'] = df5[['a','b']].apply(lambda x: '_'.join(x), axis=1)

TypeError: ('sequence item 0: expected str instance, numpy.int64 found', 'occurred at index 0')

ゲロ、、、

In [88]: df5.a.dtype
Out[88]: dtype('int64')

In [89]: df5.b.dtype
Out[89]: dtype('int64')

df5.adf5.bともintなので、strじゃねー と蹴られる。
じゃー、、、ってことで、

In [90]: df5['d'] = df5[['a','b']].apply(lambda x: '_'.join(str(x)), axis=1)

In [91]: df5
Out[91]: 
   a   b     c                                                  d
0  1   2     5  a_ _ _ _ _1_\n_b_ _ _ _ _2_\n_N_a_m_e_:_ _0_,_...
1  2   4  hoge  a_ _ _ _ _2_\n_b_ _ _ _ _4_\n_N_a_m_e_:_ _1_,_...
2  3   6     8  a_ _ _ _ _3_\n_b_ _ _ _ _6_\n_N_a_m_e_:_ _2_,_...
3  4   8     9  a_ _ _ _ _4_\n_b_ _ _ _ _8_\n_N_a_m_e_:_ _3_,_...
4  5  10    10  a_ _ _ _ _ _5_\n_b_ _ _ _ _1_0_\n_N_a_m_e_:_ _...

なんじゃこりゃ???
うーん、、、そうかlambda中のxはどうもリストlistらしい。
なら、

In [93]: df5['d'] = df5[['a','b']].apply(lambda x: '{}_{}'.format(x[0],x[1]), axis=1)

In [94]: df5
Out[94]: 
   a   b     c     d
0  1   2     5   1_2
1  2   4  hoge   2_4
2  3   6     8   3_6
3  4   8     9   4_8
4  5  10    10  5_10

うまくいった。
なるほどねー。

参考。

stackoverflow.com