如何在熊猫中将行块合并为单行?

时间:2018-07-13 12:42:13

标签: python pandas dataframe

假设我有一个这样的数据框,例如:

        0  1  2  3  4  5  6  7  8  9
    0   8  9  2  1  6  2  6  8  6  3
    1   1  1  8  3  1  6  3  6  3  9
    2   1  4  3  5  9  3  5  9  2  3
    3   4  6  3  8  4  3  1  5  1  1
    4   1  8  5  3  9  6  1  7  2  2
    5   6  6  7  9  1  8  2  3  2  8
    6   8  3  6  9  9  5  8  4  7  7
    7   8  3  3  8  7  1  4  9  7  2
    8   7  6  1  4  8  1  6  9  6  6
    9   3  3  2  4  8  1  8  1  1  8
    10  7  7  5  7  1  4  1  8  8  6
    11  6  3  2  7  6  5  7  4  8  7

我想将行放入给定长度的某些“块”中,并将其展平为单行。因此,例如,如果块长度为3,则结果为:

    0   1   2   3   4   5   6   7   8   9   10 ...  19  20  21  22  23  24  25  26  27  28  29
2   8   9   2   1   6   2   6   8   6   3   1 ...   9   1   4   3   5   9   3   5   9   2   3
5   4   6   3   8   4   3   1   5   1   1   1 ...   2   6   6   7   9   1   8   2   3   2   8
8   8   3   6   9   9   5   8   4   7   7   8 ...   2   7   6   1   4   8   1   6   9   6   6
11  3   3   2   4   8   1   8   1   1   8   7 ...   6   6   3   2   7   6   5   7   4   8   7

如何实现?

2 个答案:

答案 0 :(得分:2)

我认为需要reshape

n_blocks =3
df = pd.DataFrame(df.values.reshape(-1, n_blocks *df.shape[1]))
print (df)
   0   1   2   3   4   5   6   7   8   9  ...  20  21  22  23  24  25  26  27  \
0   8   9   2   1   6   2   6   8   6   3 ...   1   4   3   5   9   3   5   9   
1   4   6   3   8   4   3   1   5   1   1 ...   6   6   7   9   1   8   2   3   
2   8   3   6   9   9   5   8   4   7   7 ...   7   6   1   4   8   1   6   9   
3   3   3   2   4   8   1   8   1   1   8 ...   6   3   2   7   6   5   7   4   

   28  29  
0   2   3  
1   2   8  
2   6   6  
3   8   7  

[4 rows x 30 columns]

答案 1 :(得分:0)

我找到了这个解决方案,也许有人提出了更好的解决方案:

def toBlocks(df, blocklen):
  shifted = [df.shift(periods=p) for p in range(blocklen)]
  return pd.concat(shifted, axis=1)[blocklen-1:]