Получение неправильных ответов с комбинацией groupby и min (), а также с комбинацией Lo c, groupby и min в Pandas Dataframe - PullRequest
0 голосов
/ 17 марта 2020

У меня есть такой фрейм данных:

Фрейм данных

Я пытаюсь создать Dataframe, который дает мне минимальное значение для каждой категории

Я пытался

new_df = df.groupby('Category')[Reduction].min()

Это дает мне неправильный ответ. Здесь - это результат, который я получаю Ожидаемый результат: этот

, а также попытался

new_df = df.loc[df.groupby('Category')[Reduction].idxmin() , :]

Этот дает мне ValueError.

Может кто-нибудь помочь с тем, что я могу делать неправильно? Я попытался найти все возможные ответы, и я нашел только одно, что может быть пустое значение, но его нет.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Ваш 'Drawdown' столбец является dtype:object, только числовые значения будут иметь min() Сначала преобразуйте 'Drawdown' в float тип

df['Drawdown'] = pd.to_numeric(df['Drawdown'].str.strip('%'), errors='coerce')
df.groupby('ATH No.')['Drawdown'].min()
0 голосов
/ 18 марта 2020

Полагаю, у вас есть значения столбца «Сокращение» в виде строк (включая знак%). Если вы используете .min() для этого, то значения будут обрабатываться как строки, а для строк будет рассчитываться минимум. Вместо этого, если вы преобразуете значения столбца «Сокращение» в float и применяете .min(), вы сможете достичь того, что вам нужно.

df = pd.DataFrame({'Date': ['14-06-1995', '15-06-1995', '16-06-1995', '17-06-1995', '18-06-1995', '19-06-1995', '20-06-1995'],
                   'Category': ['A1', 'A1', 'A1', 'A2',  'A2', 'A3', 'A3'],
                   'Reduction': ['-1.91%', '-1.32%', '-12.34%', '-2.12%', '-1.78%', '-1.24%', '-1.20%']})
# strip off the '%' sign and convert to float
df['Reduction'] = df['Reduction'].str.rstrip('%').astype('float')
# group by and assign the min value to column 'min'
new_df = df.groupby('Category')['Reduction'].agg(min=min).reset_index()
# convert the 'min' column value back to string and append '%' sign 
new_df['min'] = new_df['min'].astype(str)+'%'
print(new_df)

Вывод:

  Category      min
0       A1  -12.34%
1       A2   -2.12%
2       A3   -1.24%

Если вы хотите выполнить это преобразование при чтении вашего фрейма данных, вы можете сделать это, добавив converters к вашим pd.read_csv() параметрам.

def convert_percentage(percentage):
    return float(percentage.rstrip('%'))

df = pd.read_csv('file.csv', converters={'Reduction': convert_percentage})

Это то, что вы ожидаете? Или ваша проблема отличается от того, что я изложил выше?

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