Как применить метод к Pandas Dataframe

У меня есть этот фрейм данных

   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 (в идеале с использованием векторизации, а не итерации) (поэтому в идеале я не хотел бы вводить один и тот же код для каждого столбца)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
434
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать str.extract для каждого столбца и использовать pd.concat для создания нового фрейма данных из результата:

x = np.concatenate([df[col].str.extract(r'(?<=\()\s*(\d+)') for col in df], axis=1)
pd.DataFrame(x, columns=df.columns)

   Col1  Col2
0  1000  3000
1  2000  4000

не нужно обращаться сюда. Согласен с этим.

anky 27.05.2019 18:07
Ответ принят как подходящий

Вы можете использовать функцию применять, чтобы применить операцию ко всем элементам в обеих строках.

# 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

anky 27.05.2019 18:08

Вы можете использовать метод applymap кадра данных pandas. Это будет выглядеть примерно так:

import re

function_to_apply = lambda x: re.search("[0-9]+", x).group()
your_dataframe.applymap(function_to_apply)

Возможно, что-то подобное сработает в вашем случае и, безусловно, будет немного проще!

Мне нравится то, что вы там сделали с re. Однако в этом случае вам нужно использовать df.applymap! Смотрите мой ответ выше.

pnovotnyq 27.05.2019 17:29

Спасибо, и хороший улов, я отредактирую соответственно!

PirateNinjas 27.05.2019 17:33

Другие вопросы по теме