我有一个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发布于 2018-04-30 10:12:07
您可以使用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')发布于 2018-04-30 10:13:01
这是使用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发布于 2018-04-30 10:04:47
一种方法是将Quarter_X数据组合到一个列表中。然后通过numpy / itertools在一个新的dataframe中展开列表系列。
这通常比基于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}})https://stackoverflow.com/questions/50098113
复制相似问题