Python 如何在dataframe中使用apply()中的shift()并仍然访问完整系列?

Python 如何在dataframe中使用apply()中的shift()并仍然访问完整系列?,python,pandas,apply,shift,Python,Pandas,Apply,Shift,我有一个dataframe,在这里我试图创建一个新的列,基于对两列应用lambda closeunadj qtr_timedelta date 2021-05-18 128.75 107 2021-05-19 130.21 108 2021-05-20 132.15 109 2021-05-21 132.30 110 2021-05-24 133.34 113 <class 'pandas.core.frame.DataFrame'> Date

我有一个dataframe,在这里我试图创建一个新的列,基于对两列应用lambda

closeunadj  qtr_timedelta
date        
2021-05-18  128.75  107
2021-05-19  130.21  108
2021-05-20  132.15  109
2021-05-21  132.30  110
2021-05-24  133.34  113

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1021 entries, 2017-05-01 to 2021-05-24
Data columns (total 2 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   closeunadj     1021 non-null   float64
 1   qtr_timedelta  1021 non-null   int64  
dtypes: float64(1), int64(1)
memory usage: 63.9 KB
但是,由于apply()正在逐行运行,因此我无法获取shift()来访问完整的“closeunadj”系列以计算实际的shift()。因此,我得到一个“AttributeError:'numpy.float64'对象没有属性'shift'”

如果我把分母改为

x.loc[:,’closeunadj’].shift(x[‘qtr_timedelta’]) 
为了让shift()访问整个系列,我得到了“IndexingError:索引器太多”


非常感谢任何帮助或建议!

一种方法是在
应用
中的
移位
使用完整的系列
最终合并['closeunadj']
,然后使用
loc
x.name
(即当前行的索引)获取正确的值。不确定它是否是最有效的,但因为您的数据帧大约有1K行,所以应该可以

final_merge['qtr_gwth'] = (
    final_merge[['closeunadj', 'qtr_timedelta']]
      .apply(lambda x : x['closeunadj'] / final_merge['closeunadj'].shift(x['qtr_timedelta']).loc[x.name] - 1, 
             axis=1)
)

列qtr_timedelta中有多少不同的值,最终合并['qtr_timedelta']的结果是什么。nunique()
?感谢.107唯一值。感谢您的建议,但我得到了以下错误代码“TypeError:切片索引必须是整数或无或具有索引方法“我可以使用:final_merge['qtr_gwth']=final_merge.apply(lambda x:x['closeunadj']/final_merge.loc[:,'closeunadj'].shift(x['qtr_timedelta']),axis=1,使代码运行时不会出错。”但是所有的值都返回为nan,这显然仍然不正确。@user11079386 hmm如果我使用你的方法,我在列中只得到nan。也许可以添加
final_merge[[closeunadj','qtr_timedelta']]的结果。head(5)。to_dict()
在您的问题中,查看我在尝试复制数据时犯了什么错误是的。这是一种从移位序列获取正确索引值的方法。我希望最终合并['qtr\u gwth']=final\u merge.apply(lambda x:x['closeunadj']/final\u merge['closeunadj'].shift(x['qtr\u timedelta'])。loc[x['closeunadj'],axis=1)我不知道这会不会有什么不同,但是你运行的熊猫版本是什么,你的答案没有“TypeError:切片索引必须是整数或无或有索引方法”?
final_merge['qtr_gwth'] = (
    final_merge[['closeunadj', 'qtr_timedelta']]
      .apply(lambda x : x['closeunadj'] / final_merge['closeunadj'].shift(x['qtr_timedelta']).loc[x.name] - 1, 
             axis=1)
)