首页 > 解决方案 > 是否有一个熊猫函数可以将例如前三行连接在一起(就像我有一个长度为三的窗口)

问题描述

例如我有下面的DataFrame

df13 = pd.DataFrame(np.random.randint(1,9, size=(5,3)), 
                    columns=['a','b','c'])
df13
   a  b  c
0  8  5  2
1  5  7  7
2  3  7  5
3  7  7  7
4  2  2  6

并且想要

      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

(不得删除任何行)

熊猫没有这样做的功能吗?

标签: pythonpandasdataframe

解决方案


这将在 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 |
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

推荐阅读