以逗号分隔值的大熊猫分隔列,但保持顺序

时间:2018-08-07 23:23:58

标签: python pandas

我在数据框中有以下一列:

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

有没有自动的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

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向其传递函数:

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

其中function = lambda x: {k:k for k in x}。因此,基本上,我们将对输入func运行此[en-us, en-en],然后对[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 s