python - Pandas 中的条件宽格式到长格式

标签 python pandas

我有以下宽格式示例数据集,没有日期和值列的任何名称

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/

相关文章:

python - 在滚动窗口上的 pandas 数据框上应用自定义函数

python - 尝试打印文本时 Pygame 不更新显示

python - Wand 未正确设置 Jpeg 图像分辨率

python - pandas - 将多个重复项从 df 提取到另一个

python - Pandas 从列中可用的列表数据中扩展行

python-3.x - str 对 csv 格式的响应

python - Pandas:根据多个条件生成句子并将其显示在单独的列中

java - 如何将包含 java 或 python 代码的变量从 php 文件传输到空文件(.java 或 .py)?

python - 使用分组边界的 SciPy 优化

python - pandas 比较并从另一个数据框中选择最小的数字