我有一个如下所示的数据框:
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
或者最好的方法是什么。我觉得我缺少一种简单的方法。
最佳答案
第一个想法是使用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.idxmax
使用索引值的差异和 DataFrameGroupBy.idxmin
,但不幸的是缺失值没有被省略,所以首先需要 DataFrame.dropna
然后通过 Series.map
创建新值列:
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
关于python - 查找一列的最小和最大行并减去另一列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61996060/