У меня есть этот фрейм данных
Col1 Col2
0 A (1000 EUR) C ( 3000 USD)
1 B (2000 CHF) D ( 4000 GBP)
Я хотел бы преобразовать его в
Col1 Col2
0 1000 3000
1 2000 4000
Я знаю, как создать фрейм данных (с индексами) для 1 столбца, но не для нескольких столбцов
Этот код дает этот результат
Col1
0 1000
1 2000
a = z['Col1'].str.split('(').str[-1].str.split().str[0].apply(pd.to_numeric,errors='coerce')
как я могу изменить приведенный выше код, чтобы также добавить col2 (в идеале с использованием векторизации, а не итерации) (поэтому в идеале я не хотел бы вводить один и тот же код для каждого столбца)
Вы можете использовать функцию применять, чтобы применить операцию ко всем элементам в обеих строках.
# creates your dataframe
df = pd.DataFrame({'Col1':['A (1000 EUR)','B (2000 CHF)'], 'Col2':['C (3000 USD)', 'D (4000 GBP)']})
# use the apply function to apply your code to all elements of both columns
df = df.apply(lambda x: x.str.split('(').str[-1].str.split().str[0].apply(pd.to_numeric,errors='coerce'))
Делает трюк для меня
Я бы использовал df.applymap. Отличие от df.apply
в том, что df.apply
принимает целую серию (строку или столбец) в качестве аргумента и применяет функцию, где df.applymap
берет каждый элемент DataFrame и применяет функцию. Попробуй это:
df = df.applymap(lambda x: pd.to_numeric(str(x).split('(')[1].split()[0], errors='coerce'))
печать (дф)
Col1 Col2
0 1000 3000
1 2000 4000
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 2 columns):
Col1 2 non-null int64
Col2 2 non-null int64
dtypes: int64(2)
memory usage: 48.0 bytes
None
очень интересно, как и этот. +1
Вы можете использовать метод applymap
кадра данных pandas. Это будет выглядеть примерно так:
import re
function_to_apply = lambda x: re.search("[0-9]+", x).group()
your_dataframe.applymap(function_to_apply)
Возможно, что-то подобное сработает в вашем случае и, безусловно, будет немного проще!
Мне нравится то, что вы там сделали с re
. Однако в этом случае вам нужно использовать df.applymap
! Смотрите мой ответ выше.
Спасибо, и хороший улов, я отредактирую соответственно!
не нужно обращаться сюда. Согласен с этим.