Python 从Pandas中前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

正在寻找一种方法来执行以下操作,但效率更高

我正在盘点数据,查看过去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        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现在解决了吗?如果是,请通过接受答案(单击其复选标记)将其标记为已解决。如果没有,请随意解释什么不起作用。