Разделение фрейма данных на основе элементов списка в столбце

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я хочу разделить фрейм данных на основе элементов списка в столбце

                Name     Currency_Pair
0         Currency1     [ccy_UK_GBX=Minor, ccy_UK_USD=Foreign]
1         Currency2     []
2         Currency3     [ccy_UK_GBP=Major]
4         Currency4     []
 

Выходной фрейм данных:

                Name     Country CCY     Denom
0         Currency1     UK      GBX     Minor
1         Currency1     UK      USD     Foreign
2         Currency2     NaN     NaN     NaN
3         Currency3     UK      GBP     Major
4         Currency4     NaN     NaN     NaN

 

Как мне этого добиться?

Комментарии:

1. Что вы пробовали до сих пор? Pandas explode и series.str.split() кажутся хорошим местом для начала

2. Я пытался использовать melt, потому что explode выдавал ошибку атрибута. Я понял, что explode доступен только для pandas> = 0.25. В итоге я обновил свою conda, чтобы заставить ее работать.

Ответ №1:

Рассмотрим df :

 In [238]: df = pd.DataFrame({'Name':['Currency1', 'Currency2', 'Currency3', 'Currency4'], 'Currency_Pair':[['ccy_UK_GBX=Minor', 'ccy_UK_USD=Foreign'], [], ['ccy_UK_GBP=Major'], []]})

In [239]: df
Out[239]: 
        Name                           Currency_Pair
0  Currency1  [ccy_UK_GBX=Minor, ccy_UK_USD=Foreign]
1  Currency2                                      []
2  Currency3                      [ccy_UK_GBP=Major]
3  Currency4                                      []
 

Используйте df.explode с Series.str.split :

 In [242]: df = df.explode('Currency_Pair')

In [244]: df['Country'] = df.Currency_Pair.str.split('_').str[1]

In [245]: df['CCY'] = df.Currency_Pair.str.split('_').str[2].str.split('=').str[0]

In [246]: df['Denom'] = df.Currency_Pair.str.split('=').str[-1]

In [247]: df
Out[247]: 
        Name       Currency_Pair Country  CCY    Denom
0  Currency1    ccy_UK_GBX=Minor      UK  GBX    Minor
0  Currency1  ccy_UK_USD=Foreign      UK  USD  Foreign
1  Currency2                 NaN     NaN  NaN      NaN
2  Currency3    ccy_UK_GBP=Major      UK  GBP    Major
3  Currency4                 NaN     NaN  NaN      NaN
 

Комментарии:

1. Хороший ответ 1, я думаю, expand=True было бы полезно

2. Спасибо @ansev . expand=True не создало бы большой разницы, так как мне все равно придется выполнять операции и многократное разделение по всем столбцам.

3. @ansev,@Mayank — Explode доступен только для pandas> = 0.25. Спасибо, обновил мои pandas, и это работает.

Ответ №2:

Series.str.split с '_|=' помощью и expand=True

 df2 = df.explode('Currency_Pair').reset_index(drop=True)
new_df = (df2.join(df2['Currency_Pair'].str.split('_|=', expand=True)
                                       .loc[:, 1:]
                                       .set_axis(['Country', 'CCY', 'Denom'],  
                                                 axis=1))
             .drop('Currency_Pair', axis=1))
 

Вывод

 print(new_df)

        Name Country  CCY    Denom
0  Currency1      UK  GBX    Minor
1  Currency1      UK  USD  Foreign
2  Currency2     NaN  NaN      NaN
3  Currency3      UK  GBP    Major
4  Currency4     NaN  NaN      NaN