如何在 Pandas 中连接列和枢轴保持列信息

ppr*_*mek 1 python plot dataframe pandas

我有一个输入 df:

input_ = pd.DataFrame.from_records(
[
    ['X_val', 'Y_val1', 'Y_val2', 'Y_val3'],
    [1, 10, 11, 31],
    [2, 20, 12, 21],
    [3, 30, 13, 11],])
Run Code Online (Sandbox Code Playgroud)

并且想要连接每个 y 值但仍然不同,用于绘图和分析的值来自哪里,我有多个具有可变数量的 Y 列的文件,最终将它们逐列连接起来并以相乘的值扩展,但想知道是否有是一个更好的解决方案,因为我的非常乏味。

expected_output_ = pd.DataFrame.from_records(
[
    ['X_val', 'Y_val' 'Y_type'],
    [1, 10, 'Y_val1'],
    [1, 11, 'Y_val2'],
    [1, 31, 'Y_val3'],
    [2, 20, 'Y_val1'],
    [2, 12, 'Y_val2'],
    [2, 21, 'Y_val3'],
    [3, 30, 'Y_val1'],
    [3, 13, 'Y_val2'],
    [3, 11, 'Y_val3'],])
Run Code Online (Sandbox Code Playgroud)

Sea*_*ean 5

您可以使用pandas.DataFrame.melt

input_.melt(
    id_vars=['X_val'],
    value_vars=['Y_val1', 'Y_val2', 'Y_val3'],
    var_name='Y_type',
    value_name='Y_val'
).sort_values(['X_val'], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

或者,正如@Vishnudev 所建议的,您还可以使用以下变体,尤其是对于大量类似命名的Y_val*列:

input_.melt(
    id_vars=['X_val'],
    value_vars=input_.filter(regex='Y_val').columns,
    var_name='Y_type',
    value_name='Y_val'
).sort_values(['X_val'], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

输出:

    X_val   Y_type  Y_val
0       1   Y_val1     10
1       1   Y_val2     11
2       1   Y_val3     31
3       2   Y_val1     20
4       2   Y_val2     12
5       2   Y_val3     21
6       3   Y_val1     30
7       3   Y_val2     13
8       3   Y_val3     11
Run Code Online (Sandbox Code Playgroud)

或者,您可以根据需要重新排列列顺序。