【问题标题】:Getting Incorrect answers with combination of groupby and min() and also with combination of Loc, groupby and min in Pandas Dataframe使用 groupby 和 min() 的组合以及 Pandas Dataframe 中的 Loc、groupby 和 min 的组合得到不正确的答案
【发布时间】:2020-03-18 19:25:32
【问题描述】:

我有一个这样的数据框:

Dataframe

我正在尝试创建一个数据框,为每个类别提供最小值

我试过了

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

这给了我错误的答案。 Here 是我得到的输出 预期结果是this

也试过了

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

这个给我ValueError.

任何人都可以帮助我可能做错了什么吗?我尝试搜索所有可能的答案,我发现的唯一一个是可能有空白值但没有。

【问题讨论】:

  • 您可以复制并粘贴您的数据框和您的预期输出吗?
  • df.groupby(['Category'])['Reduction'].min()
  • @JoelBondurant :没有帮助,因为它提供了相同的输出。
  • 您的预期输出是什么?请关注How to create a Minimal, Reproducible Example
  • 已添加所需数据帧最少的图像以及预期输出和实际输出。请帮忙。

标签: python pandas dataframe


【解决方案1】:

我猜您将“缩减”列值作为字符串(包括 % 符号)。如果您对此使用.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})

这是您所期待的吗?还是您的问题与我上面所说的不同?

【讨论】:

    【解决方案2】:

    您的'Drawdown' 列是dtype:object,只有数值具有min() 首先将您的'Drawdown' 转换为float 类型

    df['Drawdown'] = pd.to_numeric(df['Drawdown'].str.strip('%'), errors='coerce')
    df.groupby('ATH No.')['Drawdown'].min()
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 2020-01-28
      • 2014-06-28
      • 2021-06-22
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多