列表列,将列表转换为字符串作为新列

clg*_*lg4 6 python string list pandas

我有一个包含一列列表的数据框,可以使用以下命令创建:

import pandas as pd
lists={1:[[1,2,12,6,'ABC']],2:[[1000,4,'z','a']]}
#create test dataframe
df=pd.DataFrame.from_dict(lists,orient='index')
df=df.rename(columns={0:'lists'})
Run Code Online (Sandbox Code Playgroud)

数据框df如下所示:

                lists
1  [1, 2, 12, 6, ABC]
2     [1000, 4, z, a]
Run Code Online (Sandbox Code Playgroud)

我需要创建一个名为' liststring' 的新列,它将每个列表的每个元素都包含在内,lists并创建一个字符串,每个元素用逗号分隔.每个列表的元件可以是int,float,或string.结果将是:

                lists    liststring
1  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
2     [1000, 4, z, a]    1000,4,z,a
Run Code Online (Sandbox Code Playgroud)

我尝试了各种各样的东西,包括从将熊猫DF列表转换为字符串:

df['liststring']=df.lists.apply(lambda x: ', '.join(str(x)))
Run Code Online (Sandbox Code Playgroud)

但不幸的是,结果需要每个字符并用逗号分隔:

                lists                                         liststring
1  [1, 2, 12, 6, ABC]  [, 1, ,,  , 2, ,,  , 1, 2, ,,  , 6, ,,  , ', A...
2     [1000, 4, z, a]  [, 1, 0, 0, 0, ,,  , 4, ,,  , ', z, ', ,,  , '...
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

cs9*_*s95 15

列表理解

如果性能很重要,我强烈推荐这个解决方案,我可以解释原因.

df['liststring'] = [','.join(map(str, l)) for l in df['lists']]
df

                lists    liststring
0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
1     [1000, 4, z, a]    1000,4,z,a
Run Code Online (Sandbox Code Playgroud)

您可以使用函数将其扩展到更复杂的用例.

def try_join(l):
    try:
        return ','.join(map(str, l))
    except TypeError:
        return np.nan

df['liststring'] = [try_join(l) for l in df['lists']]
Run Code Online (Sandbox Code Playgroud)

Series.apply/ Series.agg','.join

您需要先将列表项转换为字符串,这就是map派上用场的地方.

df['liststring'] = df['lists'].apply(lambda x: ','.join(map(str, x)))
Run Code Online (Sandbox Code Playgroud)

要么,

df['liststring'] = df['lists'].agg(lambda x: ','.join(map(str, x)))
Run Code Online (Sandbox Code Playgroud)

df
                lists    liststring
0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
1     [1000, 4, z, a]    1000,4,z,a
Run Code Online (Sandbox Code Playgroud)

pd.DataFrame 构造函数 DataFrame.agg

非loopy/non-lambda解决方案.

df['liststring'] = (
 pd.DataFrame(df.lists.tolist())
   .fillna('')
   .astype(str)
   .agg(','.join, 1)
   .str.strip(',')
)

df
                lists    liststring
0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
1     [1000, 4, z, a]    1000,4,z,a
Run Code Online (Sandbox Code Playgroud)

  • 将它压缩为`df ['lists'].apply(lambda x:','.join(map(str,x)))`? (5认同)

Sco*_*ton 10

一种方法是使用列表理解str、 和join

df['liststring'] = df.lists.apply(lambda x: ', '.join([str(i) for i in x]))
Run Code Online (Sandbox Code Playgroud)

输出:

                lists        liststring
1  [1, 2, 12, 6, ABC]  1, 2, 12, 6, ABC
2     [1000, 4, z, a]     1000, 4, z, a
Run Code Online (Sandbox Code Playgroud)


Sou*_*oul 7

所有这些对我来说都不起作用(处理文本数据),对我有用的是:

    df['liststring'] = df['lists'].apply(lambda x: x[1:-1])
Run Code Online (Sandbox Code Playgroud)