#python #pandas
Вопрос:
Есть ли способ вернуть один стандартный объект python при выборе максимального значения из столбца DF?
Тестовый код:
import pandas as pd
df = pd.DataFrame({"A": [1,2,3,4], "Date": ['2010-01-01 00:00:01', '2010-02-01 00:00:01', '2019-01-01 00:00:01', '2010-01-01 00:00:01']})
df['Date']= pd.to_datetime(df['Date'])
Испытание 1:
type(df["Date"].max())
pandas._libs.tslibs.timestamps.Timestamp
Испытание 2:
type(df["A"].max())
numpy.dtype[int64]
В идеале я хочу иметь функцию, в которую я могу передать DF и имя столбца и получить максимальное значение в стандартном объекте python без необходимости загружать операторы типа if == style.
Песудо-кодовая идея:
def find_max(df, col):
max_val = df[col].max()
max_val.into_python_type()
return max_val
x = find_max(df, 'Date')
type(x)
datetime.datetime
x = find_max(df, 'A')
type(x)
int
Редактировать
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 4 non-null int64
1 Date 4 non-null datetime64[ns]
dtypes: datetime64[ns](1), int64(1)
memory usage: 192.0 bytes
pd. __version__
'1.2.4'
Python 3.9.4
Комментарии:
1. В случае с меткой времени, в какой тип python вы бы хотели ее преобразовать? в python нет формата временных меток, поэтому я бы предположил, что либо строка, либо поплавок?. В случае
df["A"].max()
, если вы можете просто изменить его наmax(df["A"].tolist())
, и он выйдет как тип python.2. Привет, метка времени в строке будет работать для моего случая использования.
3. В этом случае просто приведите его к строке, т. е.
str(df['Date'].max())
4. Процитирую мой первый комментарий: «В случае
df["A"].max()
, если вы можете просто изменить его наmax(df["A"].tolist())
, и он выйдет как тип python»… Если вы это сделаете, он выйдет как python int. Тем не менее, я не понимаю, почему вы хотите, чтобы это был python int, а не numpy int, какая вам разница?5. Добавлены некоторые правки, чтобы осветить ваши комментарии @Cimbali, было бы неплохо включить строковые и числовые типы. Дата-время-это бонус, но я могу работать и без этого.
Ответ №1:
Решил эту проблему с помощью некоторых идей в комментариях:
def _get_max_val(self, df, param_name):
try:
max = df[param_name].max().tolist()
except AttributeError:
max = str(df[param_name].max())
return max
Дает мне то, что мне нужно