首页 > 解决方案 > 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 等)

目标:

对于 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

(当然除了实际值,但我想要这些变量的值)

标签: pythonpandas

解决方案


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

推荐阅读