首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将熊猫数据中的列转换为多行

将熊猫数据中的列转换为多行
EN

Stack Overflow用户
提问于 2018-04-30 09:58:23
回答 3查看 8.3K关注 0票数 6

我有一个Dataframe,看起来像这样:

代码语言:javascript
复制
   Deal  Year  Quarter_1  Quarter_2  Quarter_3  Financial_Data
h     1  1991          1          2          3             120
i     2  1992          4          5          6              80
j     3  1993          7          8          9             100

我想把所有季度合并成一个新的专栏,复制交易编号、年份和财务数据。最终结果应该如下所示:

代码语言:javascript
复制
   Deal  Year  Quarter  Financial_Data
h     1  1991        1             120
i     1  1991        2             120
j     1  1991        3             120
k     2  1992        4              80
l     2  1992        5              80
m     2  1992        6              80
n     3  1993        7             100
o     3  1993        8             100
p     3  1993        9             100
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-30 10:12:07

您可以使用melt方法。

代码语言:javascript
复制
df = pd.melt(d, id_vars=["Deal", "Year", "Financial_Data"], 
             value_name="Quarter").drop(['variable'],axis=1).sort_values('Quarter')

输出

代码语言:javascript
复制
   Deal  Year  Financial_Data  Quarter
0     1  1991             120        1
3     1  1991             120        2
6     1  1991             120        3
1     2  1992              80        4
4     2  1992              80        5
7     2  1992              80        6
2     3  1993             100        7
5     3  1993             100        8
8     3  1993             100        9

如果您有许多列,则可以使用df.columns.tolist()方法来实现您的需求。

代码语言:javascript
复制
column_list = df.columns.tolist()
id_vars_list = column_list[:2] + column_list[-1:]

声明将变成

代码语言:javascript
复制
df = pd.melt(d, id_vars=id_vars_list, 
             value_name="Quarter").drop(['variable'],axis=1).sort_values('Quarter')
票数 7
EN

Stack Overflow用户

发布于 2018-04-30 10:13:01

这是使用melt完成的

代码语言:javascript
复制
pd.melt(df, id_vars=['Deal','Year','Financial_Data'], value_vars=['Quarter_1','Quarter_2','Quarter_3'])
   Deal  Year  Financial_Data   variable  value
0     1  1991             120  Quarter_1      1
1     2  1992              80  Quarter_1      4
2     3  1993             100  Quarter_1      7
3     1  1991             120  Quarter_2      2
4     2  1992              80  Quarter_2      5
5     3  1993             100  Quarter_2      8
6     1  1991             120  Quarter_3      3
7     2  1992              80  Quarter_3      6
8     3  1993             100  Quarter_3      9

把它清理一下:

代码语言:javascript
复制
>>> pd.melt(df, id_vars=['Deal','Year','Financial_Data'], value_vars=['Quarter_1','Quarter_2','Quarter_3']).drop('variable',axis=1).sort_values('value')
   Deal  Year  Financial_Data  value
0     1  1991             120      1
3     1  1991             120      2
6     1  1991             120      3
1     2  1992              80      4
4     2  1992              80      5
7     2  1992              80      6
2     3  1993             100      7
5     3  1993             100      8
8     3  1993             100      9
票数 2
EN

Stack Overflow用户

发布于 2018-04-30 10:04:47

一种方法是将Quarter_X数据组合到一个列表中。然后通过numpy / itertools在一个新的dataframe中展开列表系列。

这通常比基于stackgroupby的方法更有效。注意,结果索引是从父行提取的。您需要根据需要重新编制索引。

代码语言:javascript
复制
from itertools import chain
import numpy as np

df['Quarters'] = list(zip(df.Quarter_1, df.Quarter_2, df.Quarter_3))

lens = list(map(len, df.Quarters))

res = pd.DataFrame({'Deal': np.repeat(df.Deal, lens),
                    'Year': np.repeat(df.Year, lens),
                    'Quarter': list(chain.from_iterable(df.Quarters)),
                    'FinancialData': np.repeat(df.FinancialData, lens)})

print(res)

   Deal  FinancialData  Quarter  Year
h     1            120        1  1991
h     1            120        2  1991
h     1            120        3  1991
i     2             80        4  1992
i     2             80        5  1992
i     2             80        6  1992
j     3            100        7  1993
j     3            100        8  1993
j     3            100        9  1993

对于多列,上面的方法可能很昂贵,但您可以这样做:

代码语言:javascript
复制
res = pd.DataFrame({**{'Quarter': list(chain.from_iterable(df.Quarters))},
                    **{k: np.repeat(df[k], lens) for k in df if 'Quarter' not in k}})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50098113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档