我有以下宽格式示例数据集,没有日期和值列的任何名称
RIC Company 31/12/2021 31/12/2020 31/12/2019
ABC ABC ltd 0.77 0.75 0.66
XYZ XYZ ltd 7846.43 na 6607.29
CDF CDF ltd 191.14 127.74 63.92
我需要将其转换为长格式,如下所示
RIC Company Date Value
ABC ABC ltd 31/12/2021 0.77
ABC ABC ltd 31/12/2020 0.75
ABC ABC ltd 31/12/2019 0.66
XYZ XYZ ltd 31/12/2021 7846.43
XYZ XYZ ltd 31/12/2020 na
XYZ XYZ ltd 31/12/2019 6607.29
CDF CDF ltd 31/12/2021 191.14
CDF CDF ltd 31/12/2020 127.74
CDF CDF ltd 31/12/2019 63.92
我似乎无法绕过在日期部分使用 pd.melt/pd.wide_to_long/pyjanitor 。 我尝试了一些示例代码(使用 pyjanitor),但出现错误。任何帮助表示赞赏。谢谢。
(df
.pivot_longer(
index = ['RIC','Company'],
names_to = ('.value', 'Date'),
sort_by_appearance=True)
)
最佳答案
您可以融合提供索引的数据框、变量列以及变量和值列的名称:
df.melt(['RIC', 'Company'],
['31/12/2021', '31/12/2020', '31/12/2019'],
'Date',
'Value')
输出:
RIC Company Date Value
0 ABC ABC ltd 31/12/2021 0.77
1 XYZ XYZ ltd 31/12/2021 7846.43
2 CDF CDF ltd 31/12/2021 191.14
3 ABC ABC ltd 31/12/2020 0.75
4 XYZ XYZ ltd 31/12/2020 na
5 CDF CDF ltd 31/12/2020 127.74
6 ABC ABC ltd 31/12/2019 0.66
7 XYZ XYZ ltd 31/12/2019 6607.29
8 CDF CDF ltd 31/12/2019 63.92
如果您不想手动输入所有列,则可以排除不需要的列:
df.melt(['RIC', 'Company'],
[col for col in df if col not in {'RIC', 'Comapny'}],
'Date',
'Value')
关于python - Pandas 中的条件宽格式到长格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73621735/