社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

sam_sam • 3 年前 • 1266 次点击  

我有一个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
 
1266 次点击  
文章 [ 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