私は次のもので作成できるリストの列を持つデータフレームを持っています:
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
の各リストのすべての要素を取得し、各要素をコンマで区切った文字列を作成します。各リストの要素は、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
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, ', ,, , '...
助けてくれてありがとう!
パフォーマンスが重要な場合は、このソリューションを強くお勧めします。 理由を説明できます
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
あなたがそれを行うことができる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
これらはすべて私にとってはうまくいきませんでした(テキストデータを扱う)私にとってうまくいったのはこれです:
df['liststring'] = df['lists'].apply(lambda x: x[1:-1])
これまでの説明は非常に簡単です。ただし、複数の列を文字列区切り形式に変換する場合は、個々の列に行かなくても、次の関数をデータフレームに適用できます。列がリストの場合は、文字列形式に変換されます。
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])