Извлечение целых чисел из столбца строк - PullRequest
2 голосов
/ 10 июля 2019

У меня есть 2 кадра данных: longdf и shortdf.Longdf - это «основной» список, и мне нужно в основном сопоставлять значения от shortdf до longdf, те, которые совпадают, заменять значения в других столбцах.И longdf, и shortdf нуждаются в тщательной очистке данных.

Цель - достичь цели df.Я пытался использовать цикл for, где я хотел 1) извлечь все числа в ячейке df и 2) убрать пробел / ячейку из ячейки.Во-первых: как получается, что цикл не работает?Второе: есть ли лучший способ сделать это?

import pandas as pd

a = pd.Series(['EY', 'BAIN', 'KPMG', 'EY'])
b = pd.Series(['   10wow this is terrible data8 ', '10/ USED TO BE ANOTHER NUMBER/ 2', ' OMG 106 OMG ', '    10?7'])
y = pd.Series(['BAIN', 'KPMG', 'EY', 'EY' ])
z = pd.Series([108, 102, 106, 107 ])

goal = pd.DataFrame
shortdf = pd.DataFrame({'consultant': a, 'invoice_number':b})
longdf = shortdf.copy(deep=True)
goal = pd.DataFrame({'consultant': y, 'invoice_number':z})

shortinvoice = shortdf['invoice_number']
longinvoice = longdf['invoice_number']

frames = [shortinvoice, longinvoice]
new_list=[]

for eachitemer in frames:
    eachitemer.str.extract('(\d+)').astype(float) #extracing all numbers in the df cell
    eachitemer.str.strip() #strip the blank/whitespaces in between the numbers
    new_list.append(eachitemer)

new_short_df = new_list[0]
new_long_df = new_list[1]

1 Ответ

3 голосов
/ 10 июля 2019

Если я правильно понимаю, вы хотите взять последовательность строк, содержащих целые числа, и удалить все символы, которые не являются целыми числами.Вам не нужен цикл для этого.Вместо этого вы можете решить это с помощью простого регулярного выражения.

b.replace('\D+', '', regex=True).astype(int)

Возвращает:

0    108
1    102
2    106
3    107

Регулярное выражение заменяет все символы, которые не являются числами (обозначается \D),пустая строка, удаляющая все, что не является числом..astype(int) преобразует ряд в целочисленный тип.Вы можете объединить результат в свой окончательный кадр данных как обычно:

result = pd.DataFrame({
    'consultant': a, 
    'invoice_number': b.replace('\D+', '', regex=True).astype(int)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...