web-dev-qa-db-ja.com

リストの列、リストを新しい列として文字列に変換

私は次のもので作成できるリストの列を持つデータフレームを持っています:

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'})

データフレームdfは次のようになります。

                lists
1  [1, 2, 12, 6, ABC]
2     [1000, 4, z, a]

'liststring'と呼ばれる新しい列を作成する必要があります。これは、listsの各リストのすべての要素を取得し、各要素をコンマで区切った文字列を作成します。各リストの要素は、intfloat、またはstringです。したがって、結果は次のようになります。

                lists    liststring
1  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
2     [1000, 4, z, a]    1000,4,z,a

パンダの変換DFリストを文字列に変換する

df['liststring']=df.lists.apply(lambda x: ', '.join(str(x)))

残念ながら、結果はすべての文字を取り、コンマで区切られます:

                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, ', ,,  , '...

助けてくれてありがとう!

7
clg4

リストの理解

パフォーマンスが重要な場合は、このソリューションを強くお勧めします。 理由を説明できます

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

関数を使用して、これをより複雑なユースケースに拡張できます。

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']]

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

最初にリストアイテムを文字列に変換する必要があります。ここでmapが役立ちます。

df['liststring'] = df['lists'].apply(lambda x: ','.join(map(str, x)))

または、

df['liststring'] = df['lists'].agg(lambda x: ','.join(map(str, x)))
df
                lists    liststring
0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC
1     [1000, 4, z, a]    1000,4,z,a

pd.DataFrameコンストラクターDataFrame.agg

非ループ/非ラムダソリューション。

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
19
cs95

あなたがそれを行うことができる1つの方法は、リスト内包表記、str、およびjoinを使用することです:

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

出力:

                lists        liststring
1  [1, 2, 12, 6, ABC]  1, 2, 12, 6, ABC
2     [1000, 4, z, a]     1000, 4, z, a
4
Scott Boston

これらはすべて私にとってはうまくいきませんでした(テキストデータを扱う)私にとってうまくいったのはこれです:

    df['liststring'] = df['lists'].apply(lambda x: x[1:-1])
0
Souha

これまでの説明は非常に簡単です。ただし、複数の列を文字列区切り形式に変換する場合は、個々の列に行かなくても、次の関数をデータフレームに適用できます。列がリストの場合は、文字列形式に変換されます。

def list2Str(lst):
    if type(lst) is list: # apply conversion to list columns
        return";".join(lst)
    else:
        return lst

df.apply(lambda x: [list2Str(i) for i in x])

もちろん、特定の列にのみ適用する場合は、次のように列のサブセットを選択できます

df[['col1',...,'col2']].apply(lambda x: [list2Str(i) for i in x])
0
Memin