[英]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.