考虑以下数据:
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