我的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
答案 0 :(得分:3)
您可以使用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()
方法来满足您的要求。
id_vars_list = df.columns.tolist()
id_vars_list = id_vars_list[:2] + id_vars_list[-1]
声明将成为
df = pd.melt(d, id_vars=id_vars_list,
value_name="Quarter").drop(['variable'],axis=1).sort_values('Quarter')
答案 1 :(得分:2)
这是使用.as-console-wrapper {
max-height: 100% !important
}
:
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
答案 2 :(得分:1)
一种方法是将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}})