首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pandas MultiIndexing:复制行并在新列中添加区分信息

Python Pandas MultiIndexing:复制行并在新列中添加区分信息
EN

Stack Overflow用户
提问于 2021-01-10 00:00:05
回答 2查看 42关注 0票数 2

我是一个python初学者,试图复制现有的行,同时在新列中添加区分信息。目前,我的DataFrame是这样的:

代码语言:javascript
复制
Patient  Visit
      1     V1
      1     V2
      1     V3
      2     V1
      2     V2

我想添加一个新列Test,对于V1,它需要Test 1,但是对于V2V3,它同时需要Test 1Test 2

代码语言:javascript
复制
Patient  Visit    Test
      1     V1  Test 1
      1     V2  Test 1
      1     V2  Test 2
      1     V3  Test 1
      1     V3  Test 2
      2     V1  Test 1
      2     V2  Test 1
      2     V2  Test 2

然后,我想进一步添加一个列Sample,它为每个测试添加一个AB示例:

代码语言:javascript
复制
Patient  Visit    Test  Sample
      1     V1  Test 1       A
      1     V1  Test 1       B
      1     V2  Test 1       A
      1     V2  Test 1       B
      1     V2  Test 2       A
      1     V2  Test 2       B
...
      2     V2  Test 2       A
      2     V2  Test 2       B

如何在其他列中添加新信息的同时复制行?谢谢你的帮助!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-10 00:20:11

您可以手动创建您的访问-测试-样本数据帧,然后使用患者数据帧进行merge

代码语言:javascript
复制
pd.MultiIndex.from_product([['V2','V3'],['Test 1', 'Test 2'],['A', 'B']], names=['Visit', 'Test', 'Sample'])\
  .union(pd.MultiIndex.from_product([['V1'],['Test 1'],['A','B']], names=['Visit', 'Test', 'Sample']))\
  .to_frame().reset_index(drop=True)\
  .merge(df, on='Visit')\
  .sort_values('Patient')

输出:

代码语言:javascript
复制
   Visit    Test Sample  Patient
0     V1  Test 1      A        1
2     V1  Test 1      B        1
4     V2  Test 1      A        1
6     V2  Test 1      B        1
8     V2  Test 2      A        1
10    V2  Test 2      B        1
12    V3  Test 1      A        1
13    V3  Test 1      B        1
14    V3  Test 2      A        1
15    V3  Test 2      B        1
1     V1  Test 1      A        2
3     V1  Test 1      B        2
5     V2  Test 1      A        2
7     V2  Test 1      B        2
9     V2  Test 2      A        2
11    V2  Test 2      B        2
票数 5
EN

Stack Overflow用户

发布于 2021-01-10 04:25:15

尝试使用explode一步一步地呈现以下内容:

创建DF:

代码语言:javascript
复制
      t = pd.DataFrame({'Patient': [1,1,1,2,2],
             'Visit': ['V1', 'V2', 'V3', 'V1', 'V2']})

       Patient  Visit
      0    1    V1
      1    1    V2
      2    1    V3
      3    2    V1
      4    2    V2

添加测试列:

代码语言:javascript
复制
    t['Test'] = t['Visit'].apply(lambda x: ['Test 1'] if x == 'V1' else ['Test 1', 'Test 2'])

     Patient    Visit   Test
   0    1         V1    [Test 1]
   1    1         V2    [Test 1, Test 2]
   2    1         V3    [Test 1, Test 2]
   3    2         V1    [Test 1]
   4    2         V2    [Test 1, Test 2]

使用explode将每个测试作为其自己的行:

代码语言:javascript
复制
       t = t.explode('Test')    # Since this cannot be done inline you need to copy this to the original DF.

       Patient  Visit   Test
       0    1   V1  Test 1
       1    1   V2  Test 1
       1    1   V2  Test 2
       2    1   V3  Test 1
       2    1   V3  Test 2
       3    2   V1  Test 1
       4    2   V2  Test 1
       4    2   V2  Test 2

对“Sample”列执行相同的操作:添加“Sample”列:

代码语言:javascript
复制
      t['Sample'] = t['Test'].apply(lambda x: ['A', 'B'])

Explode‘示例列:

代码语言:javascript
复制
      t = t.explode('Sample')

以下是最终输出:

代码语言:javascript
复制
         Patient    Visit   Test    Sample
       0    1   V1  Test 1  A
       0    1   V1  Test 1  B
       1    1   V2  Test 1  A
       1    1   V2  Test 1  B
       1    1   V2  Test 2  A
       1    1   V2  Test 2  B
       2    1   V3  Test 1  A
       2    1   V3  Test 1  B
       2    1   V3  Test 2  A
       2    1   V3  Test 2  B
       3    2   V1  Test 1  A
       3    2   V1  Test 1  B
       4    2   V2  Test 1  A
       4    2   V2  Test 1  B
       4    2   V2  Test 2  A
       4    2   V2  Test 2  B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65644664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档