Python 是否有一个pandas函数将前三行连接在一起(例如,我有一个长度为3的窗口)

Python 是否有一个pandas函数将前三行连接在一起(例如,我有一个长度为3的窗口),python,pandas,dataframe,Python,Pandas,Dataframe,例如,我有下面的数据帧 df13 = pd.DataFrame(np.random.randint(1,9, size=(5,3)), columns=['a','b','c']) df13 想要 a b c a b c a b c 0 None None None None None None 8.00 5.00 2.00 1 None None None

例如,我有下面的数据帧

df13 = pd.DataFrame(np.random.randint(1,9, size=(5,3)), 
                    columns=['a','b','c'])
df13
想要

      a     b     c     a     b     c    a    b    c
0  None  None  None  None  None  None 8.00 5.00 2.00
1  None  None  None     8     5     2 5.00 7.00 7.00
2     8     5     2     5     7     7 3.00 7.00 5.00
3     5     7     7     3     7     5 7.00 7.00 7.00
4     3     7     5     7     7     7 2.00 2.00 6.00
5     7     7     7     2     2     6  nan  nan  nan
6     2     2     6   NaN   NaN   NaN  nan  nan  nan
例如,第2行之前有2行

我是用这个代码做的

def laa(df, previous_count):
    
    dfNone = pd.DataFrame({col : None  for col in df.columns},
                        index=[0])
    df_tmp = df.copy()
    for x in range(1 ,previous_count+1):
        df_tmp = pd.concat([dfNone, df_tmp])
        df_tmp = df_tmp.reset_index()
        del df_tmp['index']
        df = pd.concat([df_tmp, df], axis=1)
    
    return df
(无行必须删除)


pandas没有这样做的功能?

这将使用pandas中的
shift()
concat()函数来实现:

df = pd.DataFrame(np.random.randint(1,9, size=(5,3)), columns=['a','b','c'])
df1 = pd.concat([df.shift(2), df.shift(1),df], axis = 1)
df2 = pd.concat([df, df.shift(-1),df.shift(-2)], axis = 1)

final_df = pd.concat([df1,df2]).drop_duplicates()
样本输出:

如果
df
如下所示:

+----+-----+-----+-----+
|    |   a |   b |   c |
|----+-----+-----+-----|
|  0 |   6 |   2 |   6 |
|  1 |   7 |   2 |   1 |
|  2 |   4 |   4 |   5 |
|  3 |   1 |   1 |   1 |
|  4 |   2 |   2 |   4 |
+----+-----+-----+-----+
然后,
final_df
将是:

+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|    |   a |   b |   c |   a |   b |   c |   a |   b |   c |
|----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
|  0 | nan | nan | nan | nan | nan | nan |   6 |   2 |   6 |
|  1 | nan | nan | nan |   6 |   2 |   6 |   7 |   2 |   1 |
|  2 |   6 |   2 |   6 |   7 |   2 |   1 |   4 |   4 |   5 |
|  3 |   7 |   2 |   1 |   4 |   4 |   5 |   1 |   1 |   1 |
|  4 |   4 |   4 |   5 |   1 |   1 |   1 |   2 |   2 |   4 |
|  3 |   1 |   1 |   1 |   2 |   2 |   4 | nan | nan | nan |
|  4 |   2 |   2 |   4 | nan | nan | nan | nan | nan | nan |
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

df=df.replace(to_replace='None',value=np.nan).dropna()
我认为会起作用。@JNevill人们在想训练回归模型,并想把前一行的值作为一个特征(比如timeseries)时会这样做?我可以通过痛苦的一行代码看到这一点,比如
dfout=pd.concat([df.head(len(df)-2),df.tail)(len(df)-1.head(len(df)-2.reset_index(),df.tail(len(df)-2.reset_index()],axis=1)
虽然像Ishwar这样发布的答案可能比像这样用head/tail蒙骗更干净。这里通常的建议是,如果您认为“我需要循环这个数据帧…”去寻找更好的解决方案。循环几乎是不需要的。
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|    |   a |   b |   c |   a |   b |   c |   a |   b |   c |
|----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
|  0 | nan | nan | nan | nan | nan | nan |   6 |   2 |   6 |
|  1 | nan | nan | nan |   6 |   2 |   6 |   7 |   2 |   1 |
|  2 |   6 |   2 |   6 |   7 |   2 |   1 |   4 |   4 |   5 |
|  3 |   7 |   2 |   1 |   4 |   4 |   5 |   1 |   1 |   1 |
|  4 |   4 |   4 |   5 |   1 |   1 |   1 |   2 |   2 |   4 |
|  3 |   1 |   1 |   1 |   2 |   2 |   4 | nan | nan | nan |
|  4 |   2 |   2 |   4 | nan | nan | nan | nan | nan | nan |
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+