Py学习  »  Python

如何在Python中以不同的大小水平重塑数据帧?

sam_sam • 3 年前 • 1297 次点击  

我有一个4000行5列的数据框。

它们是我从多个excel工作簿中读取到的信息,我将它们放在一张工作表中。现在我想以水平方式重新排列它们,基本上每次原始excel表格的标题出现在数据中时,我都想水平移动它。

你能给个建议吗。

a b 
. .
. .
. .
. . 
a b 
. .
. .
a b 
. .
. .
. .
. .
a b 
. .
. .  
. .
. .
. .
. .
a b 
. .
. .

我想要一些

a b a b a b a b a b
. . . . . . . . . .
. . . . . . . . . .
. .     . . . .
. .     . . . .
            . .
            . .

修正案:

    symbol  weight      lqdty       date
0   1712    0.007871    7.023737    20210104
1   1726    0.007650    3.221021    20210104
2   1824    0.032955    3.475508    20210104
0   1871    0.006443    4.615002    20210105
1   1887    0.007840    6.678486    20210105
2   1871    0.006443    4.615002    20210105
3   1887    0.007840    6.678486    20210105
0   1871    0.006443    4.615002    20210106
1   1887    0.007840    6.678486    20210106
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128736
 
1297 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Timus
Reply   •   1 楼
Timus    3 年前

另一种选择,前提是您的数据帧

data = {
    'symbol': [1712, 1726, 1824, 1871, 1887, 1871, 1887, 1871, 1887],
    'weight': [0.007871, 0.00765, 0.032955, 0.006443, 0.00784, 0.006443, 0.00784, 0.006443, 0.00784],
    'lqdty': [7.023737, 3.221021, 3.475508, 4.615002, 6.678486, 4.615002, 6.678486, 4.615002, 6.678486],
    'date': [20210104, 20210104, 20210104, 20210105, 20210105, 20210105, 20210105, 20210106, 20210106]
}
index = [0, 1, 2, 0, 1, 2, 3, 0, 1]
df = pd.DataFrame(data, index=index)

会是

groups = pd.Series(df.index).eq(0).cumsum().values
result = pd.concat((sdf for _, sdf in df.groupby(groups)), axis=1)

结果:

   symbol    weight     lqdty        date  symbol    weight     lqdty  \
0  1712.0  0.007871  7.023737  20210104.0    1871  0.006443  4.615002   
1  1726.0  0.007650  3.221021  20210104.0    1887  0.007840  6.678486   
2  1824.0  0.032955  3.475508  20210104.0    1871  0.006443  4.615002   
3     NaN       NaN       NaN         NaN    1887  0.007840  6.678486   

       date  symbol    weight     lqdty        date  
0  20210105  1871.0  0.006443  4.615002  20210106.0  
1  20210105  1887.0  0.007840  6.678486  20210106.0  
2  20210105     NaN       NaN       NaN         NaN  
3  20210105     NaN       NaN       NaN         NaN  
enke
Reply   •   2 楼
enke    3 年前

我假设“a”、“b”是这里的列名。

按列在数据集中的位置创建组,然后 set_index 用它。然后过滤出列名 stack 数据帧。然后我们将有一个多索引系列,其中外部索引级别是组,内部级别是列名。然后 groupby + agg(list) + DataFrame + transpose 将为我们获取所需的数据帧。

cols = df.columns.tolist()
s = df.stack().groupby(level=[0,1]).agg(list)
out = pd.DataFrame(s.tolist(), index=s.index.get_level_values(1)).fillna('').T

输出:

   symbol    weight     lqdty        date  symbol   weight     lqdty        date  symbol    weight     lqdty        date  symbol   weight     lqdty        date  
0  1712.0  0.007871  7.023737  20210104.0  1726.0  0.00765  3.221021  20210104.0  1824.0  0.032955  3.475508  20210104.0  1887.0  0.00784  6.678486  20210105.0  
1  1871.0  0.006443  4.615002  20210105.0  1887.0  0.00784  6.678486  20210105.0  1871.0  0.006443  4.615002  20210105.0                    
2  1871.0  0.006443  4.615002  20210106.0  1887.0  0.00784  6.678486  20210106.0