Python 从Pandas中前5行提取数据的最佳方法
正在寻找一种方法来执行以下操作,但效率更高 我正在盘点数据,查看过去5天的高点和低点,并将其放在一个新的数据框架中:Python 从Pandas中前5行提取数据的最佳方法,python,python-3.x,pandas,Python,Python 3.x,Pandas,正在寻找一种方法来执行以下操作,但效率更高 我正在盘点数据,查看过去5天的高点和低点,并将其放在一个新的数据框架中: Date(index) High Low datetime obj1 1 1 datetime obj2 2 2 datetime obj3 3 3 datetime obj4 4 4 datetime obj5 5 5 datetime obj6 6
Date(index) High Low
datetime obj1 1 1
datetime obj2 2 2
datetime obj3 3 3
datetime obj4 4 4
datetime obj5 5 5
datetime obj6 6 6
将成为
Date(index) High Low
datetime obj1 [] []
datetime obj2 [] []
datetime obj3 [] []
datetime obj4 [] []
datetime obj5 [1,2,3,4,5] [1,2,3,4,5]
datetime obj6 [2,3,4,5,6] [2,3,4,5,6]
这是我的代码,它可以工作,但是是一个强制嵌套for循环。有没有一种方法可以将其矢量化,或者至少可以更快地提取数据
df = getdata("SWBI",today,days_back) #just makes the df for the stock data
date_list = df.index.to_list() #makes a list of dates to iterate over
counter= 0
df_predictions= pd.DataFrame({
"date":[],
"hi_his":[],
"lo_his":[]
})
for i in date_list:
dates = date_list[counter-5:counter] #Makes a list of the previous 5 dates
counter += 1
hi = []
lo = []
for date in dates: #makes a list of the values for those 5 days
lo.append(df.loc[date]["Low"])
hi.append(df.loc[date]["High"])
#Make a temporary df to append
df_temp= pd.DataFrame({
"date":i,
"hi_his":[hi],
"lo_his":[lo]
})
df_predictions = df_predictions.append(df_temp) #df ready to de linear regression predictions
我知道您可以使用
DataFrame.tail
,在本例中df.tail(5)
,从最后5行中提取数据 您可以使用以下方法构建滑动窗口矩阵:
windows=pd.concat([df.shift(n)表示范围(5)中的n)],轴=1)
#高-低-高-低-高-低-高-低-高-低
#日期
#2021-01-01南南11
#2021-01-02 22 1.0 1.0楠楠
#2021-01-03 33 2.02.01.01.01楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠
#2021-01-04 443.032.022.011.011.01Nannan
# 2021-01-05 5 5 4.0 4.0 3.0 3.0 2.0 2.0 1.0 1.0
# 2021-01-06 6 6 5.0 5.0 4.0 4.0 3.0 3.0 2.0 2.0
然后将High
和Low
列折叠到各自的列表中:
df.High=pd.Series(windows.filter(like='High').values.tolist(),index=df.index)
df.Low=pd.Series(windows.filter(like='Low').values.tolist(),index=df.index)
#高低
#日期
#2021-01-01[1.0,楠,楠,楠,楠][1.0,楠,楠,楠,楠]
#2021-01-02[2.0,1.0,楠,楠,楠][2.0,1.0,楠,楠,楠]
#2021-01-03[3.0,2.0,1.0,楠,楠][3.0,2.0,1.0,楠,楠]
#2021-01-04[4.0,3.0,2.0,1.0,nan][4.0,3.0,2.0,1.0,nan]
# 2021-01-05 [5.0, 4.0, 3.0, 2.0, 1.0] [5.0, 4.0, 3.0, 2.0, 1.0]
# 2021-01-06 [6.0, 5.0, 4.0, 3.0, 2.0] [6.0, 5.0, 4.0, 3.0, 2.0]
如果要清空nan
列表,请检查:
df=df.applymap(lambda x:[]如果np.isnan(x).any()其他x)
#高低
#日期
# 2021-01-01 [] []
# 2021-01-02 [] []
# 2021-01-03 [] []
# 2021-01-04 [] []
# 2021-01-05 [5.0, 4.0, 3.0, 2.0, 1.0] [5.0, 4.0, 3.0, 2.0, 1.0]
# 2021-01-06 [6.0, 5.0, 4.0, 3.0, 2.0] [6.0, 5.0, 4.0, 3.0, 2.0]
是否需要添加更多信息?您要求的是最后5行^OP不是要求数据框的最后5行。他应该更改问题的标题,然后我需要前5行的数据。(例如,第六行将有一个列表,其中包含第1-5行中的值)他确实在dataframe中说了“in Pandas”而不是“in”。但我同意“previous”的更改更为清晰-在阅读问题之前,我预期会发生同样的事情。欢迎这样做。出于好奇,创建列表列的目的是什么?似乎是一种具有挑战性的工作方式,取决于目的。@DavidTurnell现在解决了吗?如果是,请通过接受答案(单击其复选标记)将其标记为已解决。如果没有,请随意解释什么不起作用。