显示除零之外的最小值以及每年的相邻列值+ Python 3+,数据框

Posted

技术标签:

【中文标题】显示除零之外的最小值以及每年的相邻列值+ Python 3+,数据框【英文标题】:Display minimum value excluding zero along with adjacent column value from each year + Python 3+, dataframe 【发布时间】:2019-05-13 04:50:47 【问题描述】:

我有一个包含三列的数据框,分别是年份、产品、价格。我想从每年的价格中计算不包括零的最小值。还想将 Product 列中的相邻值填充到最小值。

数据:

Year  Product       Price
2000   Grapes       0
2000   Apple        220
2000   pear         185
2000   Watermelon   172
2001   Orange       0 
2001   Muskmelon    90
2001   Pear         165
2001   Watermelon   99

新数据框中的理想输出:

Year  Minimum Price  Product
2000  172            Watermelon  
2001  90             Muskmelon   

【问题讨论】:

【参考方案1】:

首先按boolean indexing过滤掉0行:

df1 = df[df['Price'] != 0]

然后将DataFrameGroupBy.idxmin 用于每个组的最小Price 索引,并由loc 选择:

df2 = df1.loc[df1.groupby('Year')['Price'].idxmin()]

替代方法是使用sort_valuesdrop_duplicates

df2 = df1.sort_values(['Year', 'Price']).drop_duplicates('Year')

print (df2)
   Year     Product  Price
3  2000  Watermelon    172
5  2001   Muskmelon     90

如果可能有多个最小值,并且每个组都需要它们:

print (df)
   Year     Product  Price
0  2000      Grapes      0
1  2000       Apple    220
2  2000        pear    172
3  2000  Watermelon    172
4  2001      Orange      0
5  2001   Muskmelon     90
6  2001        Pear    165
7  2001  Watermelon     99

df1 = df[df['Price'] != 0]
df = df1[df1['Price'].eq(df1.groupby('Year')['Price'].transform('min'))]
print (df)
   Year     Product  Price
2  2000        pear    172
3  2000  Watermelon    172
5  2001   Muskmelon     90

编辑:

print (df)
   Year     Product  Price
0  2000      Grapes      0
1  2000       Apple    220
2  2000        pear    185
3  2000  Watermelon    172
4  2001      Orange      0
5  2001   Muskmelon     90
6  2002        Pear      0
7  2002  Watermelon      0

df['Price'] = df['Price'].replace(0, np.nan)
df2 = df.sort_values(['Year', 'Price']).drop_duplicates('Year')
df2['Product'] = df2['Product'].mask(df2['Price'].isnull(), 'No data')
print (df2)
   Year     Product  Price
3  2000  Watermelon  172.0
5  2001   Muskmelon   90.0
6  2002     No data    NaN

【讨论】:

我们可以排除零而不创建新的数据框来计算最小值吗? @sourabhnigam - 是的,df2 = df.loc[df.groupby('Year')['Price'].apply(lambda x: x[(x != 0)].idxmin())] 可以,但速度较慢 谢谢,我收到错误消息“ValueError:尝试获取空序列的 argmin”。如果在特定年份非零值不可用,它是否可以显示消息“无数据”? @sourabh - 给我一秒钟。 @sourabh - 没那么容易,我将No data 字符串添加到product 列。也可以将其添加到Price,但获取带有字符串的数字数据,因此不推荐。但可以通过在我的解决方案末尾添加代码 - df2['Price'] = df2['Price'].fillna('No data')

以上是关于显示除零之外的最小值以及每年的相邻列值+ Python 3+,数据框的主要内容,如果未能解决你的问题,请参考以下文章

MySQL获取每个产品组的列值最小的行[重复]

查找最小值并包含正确的列值

如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]

SQL:如何根据窗口框架中的聚合最小值/最大值选择列值(包括前面的行)

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?

Google Charts API 面积图仅在注释中显示最大值和最小值