我有这样的df:
ID1 ID2 Day Text1 Text2 Text3 ....
111 A 1 a b c
222 B 2 i j k
333 C 3 x y z
我的目标是创建一个包含Text1,Text2,Text3等所有值的新列。
ID1 ID2 Day Text1 Text2 Text3 .... Text
111 A 1 a b c a, b, c...
222 B 2
333 C 3 x y x, y, ....
我试过了:
list(zip(df.Text1,df.Text2,df.Text3,...)):
这样可行,但格式不合适。
并且:
df.apply(lambda x: ', '.join(x.astype(str)), axis=1):
这会提供所需的格式,但答案将包含所有字段。
最好的方法是什么?非常感谢!
答案 0 :(得分:3)
矢量化解决方案:
In [65]: df['Text'] = df.filter(regex='^Text\d+').add(', ').sum(1).str.rstrip(', ')
In [66]: df
Out[66]:
ID1 ID2 Day Text1 Text2 Text3 Text
0 111 A 1 a b c a, b, c
1 222 B 2 i j k i, j, k
2 333 C 3 x y z x, y, z
答案 1 :(得分:2)
您的代码非常接近。您只需在apply
上使用df[text_cols]
,其中text_cols是您要合并为新列的列的列表。
df['Text'] = df[text_cols].apply(lambda x: ''.join(x), axis=1)
答案 2 :(得分:2)
还有一个矢量化join
:
>>> df['Text'] = df.filter(regex='^Text\d+').sum(1).str.join(', ')
>>> df
ID1 ID2 Day Text1 Text2 Text3 Text
0 111 A 1 a b c a, b, c
1 222 B 2 i j k i, j, k
2 333 C 3 x y z x, y, z
答案 3 :(得分:2)
其他解决方案很棒,我想提供一个使用cat()函数的答案。
df['text'] = df[0].str.cat([df[i] for i in df.columns[1:]],sep=',')
希望有所帮助:)