python - 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
1 23 42 12 2 53
2 23 44 8 88 2
3 0 9 55 21 33
4 0 9 55 21 33
..............
在 df 我的行中,每个唯一 ID 的 ID 都重复了 N 次(在这种情况下 N = 5,但希望它在实际用例中为 21 工作,或者如果可能的话)。
在 df2 中,我在 col 1 中具有相同的唯一 ID,并且在列中具有一些值(val1、val2 等)
目标:
- 我想在每个仪器的 df 的每一行中都有 val1、val2、val3、val4、val5。
对于 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
(当然除了实际值,但我想要这些变量的值)
解决方案
DataFrame.set_index
与 一起使用DataFrame.stack
:
df2 = df2.set_index('id').stack().rename_axis(['id','new']).reset_index().drop(0, axis=1)
print (df2)
id new
0 1 val1
1 1 val2
2 1 val3
3 1 val4
4 1 val5
5 2 val1
6 2 val2
7 2 val3
8 2 val4
9 2 val5
10 3 val1
11 3 val2
12 3 val3
13 3 val4
14 3 val5
然后,如果需要添加到另一个具有不同大小的 DataFrame 可以使用GroupBy.cumcount
技巧DataFrame.merge
:
d = {
"id": [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
"col_to_fill": [0, 0, 0, 0, 0, 0, 0, 0, 0,0,0]
}
df = pd.DataFrame(d)
df['g'] = df.groupby('id').cumcount()
df2['g'] = df2.groupby('id').cumcount()
df = df.merge(df2, on=['id','g'])
print (df)
id col_to_fill g new
0 1 0 0 val1
1 1 0 1 val2
2 1 0 2 val3
3 1 0 3 val4
4 2 0 0 val1
5 2 0 1 val2
6 2 0 2 val3
7 2 0 3 val4
8 3 0 0 val1
9 3 0 1 val2
10 3 0 2 val3