Python 如何在dataframe中使用apply()中的shift()并仍然访问完整系列?
我有一个dataframe,在这里我试图创建一个新的列,基于对两列应用lambdaPython 如何在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
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)
)