[英]Convert columns into multiple rows in pandas dataframe
我有一个看起来像这样的数据框:
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
我想将所有季度合并到一个新列中并复制交易编号、年份和财务数据。 最终结果应如下所示:
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
您可以使用melt
法。
df = pd.melt(d, id_vars=["Deal", "Year", "Financial_Data"],
value_name="Quarter").drop(['variable'],axis=1).sort_values('Quarter')
输出
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()
方法来达到你的要求。
column_list = df.columns.tolist()
id_vars_list = column_list[:2] + column_list[-1:]
该声明将成为
df = pd.melt(d, id_vars=id_vars_list,
value_name="Quarter").drop(['variable'],axis=1).sort_values('Quarter')
这是使用melt
完成的:
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
稍微清理一下:
>>> 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
一种方法是将您的 Quarter_X 数据组合到一个列表中。 然后通过新数据框中的numpy
/ itertools
扩展列表系列。
这通常比基于stack
或groupby
的方法更有效。 请注意,结果索引是从父行中提取的。 您将需要根据需要重新索引。
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
对于多列,上述方法可能很昂贵,但您可以这样做:
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}})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.