我正在尝试跨行比较同一列中的值。例如,在下面的示例数据框中,我想为价格变化创建一个列,如果任何一年的价格比前一年下降/上升,则将其填充为“减少”/“增加”。
df = pd.DataFrame({
'Fruit': ['Apple', 'Orange', 'Grapes', 'Bananas', 'Apple', 'Orange',
'Grapes', 'Bananas'],
'year': [2015, 2015, 2015, 2015, 2016, 2016, 2016, 2016],
'price': [5, 7, 7, 9, 12, 9, 9, 4],
'stock': [11, 8, 10, 6, 6, 5, 9, 12]})
df['change'] = ''
df['change'] = df.apply(
lambda x:
'Reduced' if x['price'] < df.loc[
(df['Fruit'] == x['Fruit']) & (df['year'] == (x['year']-1))
]['price'].any() else x['change'],
axis=1)
我得到一个错误“列必须与键相同的长度”。此外,即使这是解决了我怀疑这是否会工作,因为行索引。
2条答案
按热度按时间t2a7ltrp1#
可以使用
groupby.diff
和numpy.where
:或者使用
numpy.sign
和map
:输出量:
如果您想与所有前几年的最大值进行比较(而不仅仅是前一年):
wixjitnu2#
谢谢@mozway,@wjandrea。我可以让它与df工作。申请!以下是看起来有效的方法。请指出使用它时可能存在的运行时风险。我明白,如果我们将价格与n年的最小/最大值进行比较,这将变得更加复杂。如果有更优雅的解决方案,我会欢迎的。