2016-03-01 6 views
2

У меня есть столбец панда dataframe который выглядит немного как:панда серии, содержащие массивы

Out[67]: 
0  ["cheese", "milk... 
1  ["yogurt", "cheese... 
2  ["cheese", "cream"... 
3  ["milk", "cheese"... 

сейчас, в конечном счете, я хотел бы это как плоский список, но при попытке сгладить это, я заметил, что панды лечат ["cheese", "milk", "cream"] в str, а не list

Как бы я идти о уплощение это, так что я в конечном итоге с:

["cheese", "milk", "yogurt", "cheese", "cheese"...] 

[EDIT]Таким образом, ответ приведен ниже, как представляется:

s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"])

s = s.str.strip("[]") 
df = s.str.split(',', expand=True) 
df = df.applymap(lambda x: x.replace("'", '').strip()) 
l = df.values.flatten() 
print (l.tolist()) 

, который является большим, вопрос ответил, ответ принят, но он кажется мне довольно безвкусным решением.

+0

Возможный дубликат [питона панд сплющивает dataframe к списку] (http://stackoverflow.com/questions/25440008/python- pandas-flatten-a-dataframe-to-list) – soon

+1

Нет, это не дубликат, потому что 'type' столбца' string' not 'list' – jezrael

ответ

2

Вы можете использовать numpy.flatten, а затем плоской вложенной lists - see:

print df 
        a 
0 [cheese, milk] 
1 [yogurt, cheese] 
2 [cheese, cream] 

print df.a.values 
[[['cheese', 'milk']] 
[['yogurt', 'cheese']] 
[['cheese', 'cream']]] 

l = df.a.values.flatten() 
print l 
[['cheese', 'milk'] ['yogurt', 'cheese'] ['cheese', 'cream']] 

print [item for sublist in l for item in sublist] 
['cheese', 'milk', 'yogurt', 'cheese', 'cheese', 'cream'] 

EDIT:

Вы можете попробовать:

import pandas as pd 

s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"]) 

#remove [] 
s = s.str.strip('[]') 
print s 
0  'cheese', 'milk' 
1 'yogurt', 'cheese' 
2  'cheese', 'cream' 
dtype: object 

df = s.str.split(',', expand=True) 
#remove ' and strip empty string 
df = df.applymap(lambda x: x.replace("'", '').strip()) 
print df 
     0  1 
0 cheese milk 
1 yogurt cheese 
2 cheese cream 

l = df.values.flatten() 
print l.tolist() 
['cheese', 'milk', 'yogurt', 'cheese', 'cheese', 'cream'] 
+0

Я думаю, что есть опечатка в' df.values.a .flatten() 'вместо этого должно быть' df.a.values.flatten() ' – shanmuga

+0

Да, вы правы. Я исправляю это. Спасибо. – jezrael

+0

это просто печатает каждое отдельное письмо для меня: 's = pd.Series ([" ['cheese', 'milk'] "," ['yogurt', 'cheese'] "," ['cheese', ' 'cream'] "])' 'l = s.values.flatten()' 'print ([item for sublist in l для элемента в подсписке])' – toast

0

Для преобразования значений столбцов из ул перечислять можно использовать df.columnName.tolist() и для выпрямления вы могли бы сделать df.columnName.values.flatten()

0

Вы можете конвертировать Series в DataFrame, а затем вызвать stack:

s.apply(pd.Series).stack().tolist() 
+0

возвращает список строк, содержащих ['milk', 'cheese'] 's = pd.Series ([" ['cheese', 'milk'] ", «['yogurt', 'cheese']", "['cheese', 'cream']"]) ' ' s.apply (pd.Series) .stack(). tolist() ' – toast

+0

От оригинала описание, я думал, что это был тип 'Series', был список строк:' s2 = pd.Series ([['сыр', 'молоко'], ['йогурт', 'сыр'], ['сыр ',' cream ']]) ', и в этом случае' s2.apply (pd.Series) .stack(). tolist() 'должен работать. Если тип 'Series' представляет собой строку, представляющую список строк, вы можете добавить eval:' s.apply (lambda x: pd.Series (eval (x))). Stack(). Tolist() ' – Colin