2017-07-25 147 views
1

我有可以與創建列表的列中的數據框:列表的Python的熊貓數據框柱,轉換列表字符串新列

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,floatstring。因此,結果將是:

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

我曾嘗試過各種事情,包括從Converting a Panda DF List into a string

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

謝謝提前尋求幫助!

回答

3

嘗試df.apply','.join。您需要先將列表項轉換爲字符串,這就是map派上用場的地方。你可以做到這一點

In [684]: df['liststring'] = df['lists'].apply(lambda x: ','.join(map(str, x))); df 
Out[684]: 
       lists liststring 
0 [1, 2, 12, 6, ABC] 1,2,12,6,ABC 
1  [1000, 4, z, a] 1000,4,z,a 
+4

濃縮成'DF [ '名單']。 apply(lambda x:','。join(map(str,x)))'? – Zero

+0

@JohnGalt謝謝:) –

+0

這個解決方案的工作原理比@斯科特波士頓還快,它也可以工作。顯然,使用列表理解緩存創造了輕微的性能下降。謝謝。 – clg4

2

一種方法是使用列表理解,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 
+1

這個工作,但比@COLDSPEED慢一點,因爲列表理解緩存...良好的解決方案,雖然upvoted ... – clg4