#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