Использование pd.Dataframe.replace с функцией apply в качестве заменяемого значения

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

У меня есть несколько фреймов данных, которые смешались в некоторых столбцах с датами в этом ASP.NET формат «/Дата (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, может быть функцией вместо статического значения.

Заранее большое вам спасибо

РЕДАКТИРОВАТЬ Чтобы попытаться внести некоторую ясность, у меня есть много столбцов во фрейме данных, более сотни, которые содержат этот формат даты. Я бы не хотел перечислять каждый отдельный столбец, содержащий дату. Есть ли способ применить функцию the clean my dates ко всем столбцам в моем наборе данных? Поэтому я хочу очистить не 1 столбец, а все сотни столбцов моего фрейма данных.

Ответ №1:

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

 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

  

Ответ №2:

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

 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
  

Комментарии:

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