<Python, pandas> 複数カラムの各要素の文字列の値をそれぞれ結合する。
複数カラム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.a
、df5.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
うまくいった。
なるほどねー。