簡體   English   中英

以逗號分隔值的大熊貓分隔列,但保持順序

[英]Split column in pandas of comma separated values but maintining the order

我在數據框中有以下列:

column_1
en-us,en-en
pr,en-us,en-en,br
ar-ar,pr,en-en

我想拆分該列(可以通過.str.split完成),但是使用.Split,我將得到:

column_1 | column_2 | column_3 | column_4
en-us      en-en
pr         en-us      en-en      br
ar-ar      pr         en-en

我需要的是:

column_1 | column_2 | column_3 | column_4
en-us      en-en      
en-us      en-en      br         pr
ar-ar      en-en                 pr

有自動的方法嗎?

IIUC,您可以通過將字典列表傳遞給默認的pd.DataFrame構造函數來完成。 例如,

df = pd.DataFrame(s.str.split(',').transform(lambda x: {k:k for k in x}).tolist())

產量

    r-ar    br  en-en   en-us   pr
0   NaN     NaN en-en   en-us   NaN
1   NaN     br  en-en   en-us   pr
2   ar-ar   NaN en-en   NaN     pr

請注意,根據您的需求重新排列數據框很簡單,例如

>>> df[['en-en', 'en-us', 'br', 'pr']]
    en-en   en-us   br  pr
0   en-en   en-us   NaN NaN
1   en-en   en-us   br  pr
2   en-en   NaN     NaN pr

如果要使用空字符串而不是NaN ,則只需使用.fillna()

df[['en-en', 'en-us', 'br', 'pr']].fillna('')

    en-en   en-us   br  pr
0   en-en   en-us       
1   en-en   en-us   br  pr
2   en-en           pr

說明

讓我們分解以下語句

s.str.split(',').transform(lambda x: {k:k for k in x}).tolist()

首先, s.str.split(',')做您已經知道的事情:使用,作為分隔符進行拆分。 這產生了以下系列

0            [en-us, en-en]
1    [pr, en-us, en-en, br]
2        [ar-ar, pr, en-en]
Name: col1, dtype: object

現在,我們想將每個元素更改為{key:value}結構。 為此,我們使用transform函數傳遞給它的transform

s.str.split(',').transform(function)

其中function = lambda x: {k:k for k in x} 因此,基本上,我們將針對輸入[en-us, en-en]運行func ,然后針對[pr, en-us, en-en, br]等運行此函數。此函數的輸出為

0                 {'en-en': 'en-en', 'en-us': 'en-us'}
1    {'br': 'br', 'en-en': 'en-en', 'en-us': 'en-us...
2     {'en-en': 'en-en', 'ar-ar': 'ar-ar', 'pr': 'pr'}

現在,我們僅使用tolist()獲取這些值的列表,並將其輸入到pd.DataFrame()構造函數中。 構造函數知道如何很好地處理字典列表,並且它基於字典的keys為每一行分配值。 每當找不到行的鍵/值時,它僅使用NaN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM