Pandas:将按列的值复制到第二个数据帧中的行



考虑以下数据:

import pandas as pd
d = {
"id": [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
"col_to_fill": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}
df = pd.DataFrame(d)
df
id  col_to_fill
0   1   0
1   1   0
2   1   0
3   1   0
4   1   0
5   2   0
6   2   0
7   2   0
8   2   0
9   2   0
10  3   0
11  3   0
12  3   0
13  3   0
14  3   0  

d1 = {
"id": [1, 2, 3],
"val1": [23, 23, 0],
"val2": [42, 44, 9],
"val3": [12, 8, 55],
"val4": [2, 88, 21],
"val5": [53, 2, 33]
}
df2 = pd.DataFrame(d1)
df2
id   val1    val2    val3    val4    val5
0   1   23  42  12  2   53
1   2   23  44  8   88  2
2   3   0   9   55  21  33

在df中,我有具有ID的行,每个唯一ID复制N次(在这种情况下N=5,但希望它在实际用例中为21工作,或者如果可能的话)。

在df2我有相同的唯一id在col1,和一些列的值(val1, val2等)

目标:

  • 我希望在每个仪器的df的每一行中都有val1, val2, val3, val4, val5。

For ID 1和2:

id  col_to_fill
1   23
1   42
1   12
1   2
1   53
2   23
2   44
2   8
2   88
2   2

以此类推…

这行不通:

df2.melt(id_vars=['id'])

因为那将是

id  variable
1   val1
1   val1
1   val1
1   val1
1   val1
2   val2
2   val2
2   val2
2   val2
2   val2

我需要:

id  variable
1   val1
1   val2
1   val3
1   val4
1   val5
2   val1
2   val2
2   val3
2   val4
2   val5

想要5每个id?或者你只是想把所有的列都转换成行?

熔化df2使您几乎一步就能到达,并添加sort_values以获得正确的顺序:

df3 = df2.melt(id_vars='id').sort_values(['id', 'variable'], ignore_index=True)

然后去掉variable列,重命名value:

df3 = df3.drop('variable', axis=1).rename({'value': 'col_to_fill'}, axis=1)
df3

重命名步骤可以通过将其设置为value_name来跳过,然后所有这些都可以组合成:

df3 = df2.melt(id_vars='id', value_name='col_to_fill') 
.sort_values(['id', 'variable'], ignore_index=True) 
.drop('variable', axis=1)
df3

输出:

id  col_to_fill
0    1           23
1    1           42
2    1           12
3    1            2
4    1           53
5    2           23
6    2           44
7    2            8
8    2           88
9    2            2
10   3            0
11   3            9
12   3           55
13   3           21
14   3           33

相关内容

最新更新