Использование pd.Dataframe.replace с функцией apply в качестве значения замены - PullRequest
0 голосов
/ 15 марта 2019

У меня есть несколько фреймов данных, которые смешались в некоторых столбцах с датами в этом формате ASP.NET "/ Date (1239018869048) /". Я выяснил, как разобрать это в формат даты и времени Python для данного столбца. Однако я хотел бы поместить эту логику в функцию, чтобы я мог передать ей любой фрейм данных и заставить его заменить все найденные даты, которые соответствуют регулярному выражению, с помощью pd.Dataframe.replace.

что-то вроде:

def pretty_dates():
    #Messy logic here

df.replace(to_replace=r'\/Date(d+)', value=pretty_dates(df), regex=True)

Проблема в том, что df, который передается pretty_dates, представляет собой весь фрейм данных, а не только ячейку, которую необходимо заменить.

Итак, концепция, которую я пытаюсь выяснить, заключается в том, что существует способ, которым значение, которое должно быть заменено при использовании df.replace, может быть функцией вместо статического значения.

Большое спасибо заранее

EDIT Чтобы попытаться внести некоторую ясность, у меня есть много столбцов в кадре данных, более ста содержат этот формат даты. Я хотел бы не перечислять каждый столбец, который имеет дату. Есть ли способ применить функцию очистки моих дат по всем столбцам в моем наборе данных? Поэтому я не хочу чистить 1 столбец, а все сотни столбцов моего информационного кадра.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Насколько я понимаю, вам нужно применить пользовательскую функцию к выделенным ячейкам в указанном столбце.Надеюсь, что вам поможет следующий пример:

import pandas as pd

df = pd.DataFrame({'x': ['one', 'two', 'three']})
selection = df.x.str.contains('t', regex=True) # put your regexp here
df.loc[selection, 'x'] = df.loc[selection, 'x'].map(lambda x: x+x) # do some logic instead

Вы можете применить эту процедуру ко всем столбцам df в цикле:

for col in df.columns:
    selection = df.loc[:, col].str.contains('t', regex=True) # put your regexp here
    df.loc[selection, col] = df.loc[selection, col].map(lambda x: x+x) # do some logic instead
0 голосов
/ 15 марта 2019

Я уверен, что вы можете использовать регулярные выражения, чтобы сделать это за один шаг, но вот как применить его ко всему столбцу сразу:

df = pd.Series(['/Date(1239018869048)/',
                '/Date(1239018869048)/'],dtype=str)

df = df.str.replace('\/Date\(', '')
df = df.str.replace('\)\/', '')
print(df)

    0    1239018869048
    1    1239018869048
    dtype: object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...