Pandas:如何重新排序 Dataframe

xzabzqsa  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(110)

示例:

data={'P1_1': ['1', '6', '5','8', '4', '7', '5', '7', '1', '7', '3', '2', '1', '4', '7', '5', '7', '1'],
        'P1_2':['3', '7', '7','9', '8', '10', '8', '9', '3', '10', '9', '5', '3', '8', '9', '6', '7', '5'],
       'P2_1': ['1', '2', '3','4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'],
         'P2_2': ['3', '7', '7','9', '8', '10', '8', '9', '8', '10', '12', '13', '14', '8', '17', '8', '2', '5']}
df=pd.DataFrame(data)

这是我的DF。

我现在要做的是重新排列列。P1和P2是类别的名称,第二个数字_1和_2是时间点。现在,我希望通过接收值将类别显示在行中,将时间点显示在列中。它看起来应该是这样的:

在第二个例子中,我添加了第三个P,只是为了有更多的值。
我想可能有一个熟悉的方法。谁能给予我一个思考的方向?

huwehgph

huwehgph1#

我不知道你的数据意味着什么,为什么或者你想让它变成这样,但是我可以和你分享一些使用pandas的技术。
我希望这也许能让你朝你需要的方向前进。

import pandas as pd

data = ...

def concat_args(*args):
    return ";".join(*args)

df = pd.DataFrame(data)
df = df.melt()
df["category"] = df["variable"].apply(lambda x: x.split("_")[0])
df["timepoint"] = df["variable"].apply(lambda x: f"T{x.split('_')[1]}")
df = pd.pivot_table(
    df, index="category", columns="timepoint", values="value", aggfunc=concat_args
)
print(df)

预期成果:

timepoint                                            T1                                         T2
category                                                                                          
P1                  1;6;5;8;4;7;5;7;1;7;3;2;1;4;7;5;7;1      3;7;7;9;8;10;8;9;3;10;9;5;3;8;9;6;7;5
P2         1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18  3;7;7;9;8;10;8;9;8;10;12;13;14;8;17;8;2;5
g2ieeal7

g2ieeal72#

用途:

data={'Punkte_Teil1_1': ['1', '6', '5','8', '4', '7', '5', '7', '1', '7', '3', '2', '1', '4', '7', '5', '7', '1'],
      'Punkte_Teil1_2': ['3', '7', '7','9', '8', '10', '8', '9', '3', '10', '9', '5', '3', '8', '9', '6', '7', '5'],
      'Punkte_Teil2_1': ['1', '2', '3','4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'],
      'Punkte_Teil2_2': ['3', '7', '7','9', '8', '10', '8', '9', '8', '10', '12', '13', '14', '8', '17', '8', '2', '5']}
df=pd.DataFrame(data)

print (df)
   Punkte_Teil1_1 Punkte_Teil1_2 Punkte_Teil2_1 Punkte_Teil2_2
0               1              3              1              3
1               6              7              2              7
2               5              7              3              7
3               8              9              4              9
4               4              8              5              8
5               7             10              6             10
6               5              8              7              8
7               7              9              8              9
8               1              3              9              8
9               7             10             10             10
10              3              9             11             12
11              2              5             12             13
12              1              3             13             14
13              4              8             14              8
14              7              9             15             17
15              5              6             16              8
16              7              7             17              2
17              1              5             18              5

使用DataFrame.pipe通过last _ by str.rsplit设置MultiIndex,然后通过DataFrame.rename_axis设置新的列名,通过DataFrame.stack整形,使用DataFrame.add_prefix,最后通过DataFrame.reset_index将MultiIndex的第二级转换为列,第二个是创建默认RangeIndex

df = (df.pipe(lambda x: x.set_axis(x.columns.str.rsplit('_', expand=True, n=1), axis=1))
        .rename_axis(['Cat',None], axis=1)
        .stack(0)
        .add_prefix('T')
        .reset_index(level=1)
        .reset_index(drop=True))
print (df.head())
            Cat T1 T2
0  Punkte_Teil1  1  3
1  Punkte_Teil2  1  3
2  Punkte_Teil1  6  7
3  Punkte_Teil2  2  7
4  Punkte_Teil1  5  7

相关问题