#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. Спасибо, однако в моем случае я заранее не знаю имен столбцов с этим форматом даты. Это фрейм данных с сотнями разных столбцов, некоторые из которых являются датами, некоторые нет. Я пытаюсь применить эту процедуру замены ко всем столбцам. Возможно ли это?