查找一列的最小和最大行并减去另一列的值

时间:2020-05-25 04:58:12

标签: python pandas

我有一个如下数据框:

df = pd.DataFrame({'regionname' : [10022, 10128, 10022, 10022, 10128],
              'date' : ['1996-04-01', '2005-01-01', '2014-05-01', '2006-04-01', '2017-06-01', '2017-06-01'],
              'median_price': [np.nan, 257700.0, 407100.0, 500000.0, 750000.0, 325000 ]})

-----------------------------------------
Output:

regionname  date        median_price
0   10022   1996-04-01  NaN
1   10128   2014-05-01  407100.0
2   10022   2006-04-01  500000.0
3   10022   2017-06-01  750000.0
4   10128   2017-06-01  325000.0

每个regionname对应于数据集中的一个邮政编码。如果有帮助,则该数据最初为宽格式,其中从1996-04到2017-06的每个日期都包含我分解为长形形式的中位数价格。

我想找到一个带有median_price的最小日期,并将其从最大日期(2017-06-01)中减去,以检查更改率。每个regionname(邮政编码)都有最大日期的数据,但最小日期有所不同。我在这里碰到过一些建议进行分组讨论的帖子,但未能完成。就我而言,grp = df.groupby('regionname')

我的目标是在新列中或通过聚合来计算更改。我已经尝试过类似的操作,但是dropna()在groupby上不起作用,那么我可以减去最大值。

min_test = df.groupby(['regionname','date'])['median_price'].dropna().min()

max_test = df.groupby(['regionname','date'])['median_price']

样本预期输出可能是这样的:

regionname  change     
0   10022   250000.0
1   10128   -82100.0
...

数据中有25个唯一的邮政编码,日期范围为1996-04-01至2017-06-01,因此至少应涵盖基本输出选项。

我不确定是否可以使用np.nanmin或最佳方法。我觉得我缺少一种简单的方法。

1 个答案:

答案 0 :(得分:1)

第一个想法是两列都使用DataFrame.sort_values,然后减去第一个和最后一个值,它可以正常工作,因为默认情况下会删除缺失的值:

df['date'] = pd.to_datetime(df['date'])

df = df.sort_values(['regionname','date'])
g = df.groupby(['regionname'])['median_price']

df['change'] = g.transform('last') - g.transform('first') 
df = df.sort_index()
print (df)          
   regionname       date  median_price    change
0       10022 1996-04-01           NaN  250000.0
1       10128 2014-05-01      407100.0  -82100.0
2       10022 2006-04-01      500000.0  250000.0
3       10022 2017-06-01      750000.0  250000.0
4       10128 2017-06-01      325000.0  -82100.0     

或者您可以使用DataFrameGroupBy.idxmaxDataFrameGroupBy.idxmin使用索引值的差异,但是不幸的是,遗漏的值不会被忽略,因此有必要先使用DataFrame.dropna,然后使用{{ 3}}:

df['date'] = pd.to_datetime(df['date'])

g = (df.dropna(subset=['median_price'])
       .set_index('median_price')
       .groupby(['regionname'])['date'])
df['change'] = df['regionname'].map(g.idxmax() - g.idxmin())

print (df)       
   regionname       date  median_price    change
0       10022 1996-04-01           NaN  250000.0
1       10128 2014-05-01      407100.0  -82100.0
2       10022 2006-04-01      500000.0  250000.0
3       10022 2017-06-01      750000.0  250000.0
4       10128 2017-06-01      325000.0  -82100.0   
相关问题