显示除零之外的最小值以及每年的相邻列值+ 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_values
和drop_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+,数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]
SQL:如何根据窗口框架中的聚合最小值/最大值选择列值(包括前面的行)