【问题标题】:Pandas: Copy column-wise values to rows in second dataframePandas:将列值复制到第二个数据框中的行
【发布时间】:2021-06-09 08:10:18
【问题描述】:

考虑这些数据:

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 中,我在 col 1 中具有相同的唯一 ID,以及一些列值(val1、val2 等)

目标:

  • 我希望 val1、val2、val3、val4、val5 在每个仪器的 df 中的每一行中向下。

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

【问题讨论】:

  • 每个id 需要 5 行是否有意义?还是您只是想将所有列转换为行?
  • @aneroid 它应该是 N 行,但总是有相同的 N 个 ID 被复制下来(即它们应该始终匹配)

标签: python pandas


【解决方案1】:

每个id 需要 5 行是否有意义?还是您只是想将所有列转换为行?

融化 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

【讨论】:

  • 谢谢!非常欣赏它。请查看更新后的问题
  • 我的答案和您更新的问题(和原始问题)具有相同的结果。第一组值是垂直的23 42 12 2 53。那么问题是什么?我的答案不是只是 df.melt,它还有排序功能,可以为您提供所需的结果。
  • @themli 如果上面的输出与您的较大数据框不匹配,那么您还有其他未提及或未正确复制粘贴的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2022-11-29
  • 2014-02-21
  • 2020-04-22
  • 2019-09-28
相关资源
最近更新 更多