2 回答

TA貢獻1817條經(jīng)驗 獲得超6個贊
首先將您的列表展平data為一個列表,然后將其作為 DataFrame 中的列讀?。?/p>
>>> data = [[['apple', 'orange','grape']],[['apple','pineapple','coconut']]]
>>> data = np.unique(np.ravel(data))
>>> df = pd.DataFrame(data, columns = ['fruit'])
>>> df
fruit
0 apple
1 coconut
2 grape
3 orange
4 pineapple
編輯新案例
嗨喬納森,我回復了你的電子郵件,如果你的列值是“喜歡”列表,你應該如何處理這些條目。你需要使用ast.literal_eval()它。
>>> df = pd.DataFrame({'fruits': ['[\'apple\', \'orange\',\'grape\']','[\'apple\',\'pineapple\',\'coconut\']']})
>>> df
fruits
0 ['apple', 'orange','grape']
1 ['apple','pineapple','coconut']
但是,這樣做,您必須遍歷該列,將列表的每個轉換表示形式放入 adummy_list中,以將所有內容收集到一個列表中并在其中執(zhí)行您想做的事情。
>>> import ast
>>> dummy_list = []
>>> for i in range(0, len(df)):
... dummy_list.extend(ast.literal_eval(df['fruits'][i]))
...
>>> dummy_list
['apple', 'orange', 'grape', 'apple', 'pineapple', 'coconut']
獲取唯一值并創(chuàng)建所需的 DataFrame:
>>> x = list(set(dummy_list))
>>> x
['orange', 'apple', 'grape', 'coconut', 'pineapple']
>>> df2 = pd.DataFrame(x, columns = ['fruits 2.0'])
>>> df2
fruits 2.0
0 orange
1 apple
2 grape
3 coconut
4 pineapple

TA貢獻2011條經(jīng)驗 獲得超2個贊
僅np.ravel(正如Anky提出的那樣)是不夠的。然后,您需要刪除重復項。如果你對非連續(xù)索引不滿意,你可以自由地重置它。
所以完整的代碼可以是:
df = pd.DataFrame(np.ravel(data),columns=['fruit'])\
.drop_duplicates().reset_index(drop=True)
np.unique(如在另一個答案中)有一個缺點,它對 源數(shù)組進行排序。我想你想保持原來的順序。
發(fā)表評論后編輯
看起來您實際上有一個DataFrame,使用read_excel()讀取,如下所示:
fruits
0 [apple, orange, grape]
1 [apple, pineapple, coconut]
(不是您帖子中提供的列表)。
要將這樣的 DataFrame 轉換為單個平面列表,您可以運行:
lst = df['fruits'].apply(pd.Series).stack().drop_duplicates().to_list()
它在“普通”(pythonic)列表中。
要創(chuàng)建具有單列的第二個 DataFrame,請運行:
df2 = pd.DataFrame(lst, columns=['fruits'])
另一種選擇,無需創(chuàng)建中間列表:
df['fruits'].apply(pd.Series).stack().rename('fruits')\
.drop_duplicates().reset_index(drop=True).to_frame()
編輯 2
我找到了一個更簡單的解決方案,考慮到read_excel 默認將所有單元格讀取為strings。
成功的關鍵是str.extractall方法,應用于fruits列。要提取撇號之間的文本,正則表達式應該是:
'(?P<fruits>[^']+)'
細節(jié):
'- 在要匹配的文本之前的撇號(代表自身)。
(?P<fruits>- 命名捕獲組的開始(也稱為fruits)。
[^']+- 該組的內容 - 除撇號外的非空字符序列。
)- 捕獲組結束。
'- 另一個撇號,在要匹配的文本之后。
因此,如果您運行:
df.fruits.str.extractall(r"'(?P<fruits>[^']+)'")
你會得到:
fruits
match
0 0 apple
1 orange
2 grape
1 0 apple
1 pineapple
2 coconut
該結果包含:
多索引:
頂級 - 源行的索引(沒有名稱),
第二級 - 匹配編號(每行 0、1 和 2)。
fruits - 連續(xù)行中帶有單個字符串的捕獲組的名稱。
現(xiàn)在只剩下刪除重復項和重置索引了。
所以完整的代碼,一條指令是:
df.fruits.str.extractall("'(?P<fruits>[^']+)'")\
.drop_duplicates().reset_index(drop=True)
結果是:
fruits
0 apple
1 orange
2 grape
3 pineapple
4 coconut
添加回答
舉報