Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python索引:复制行并在新列中添加区分信息_Python_Pandas - Fatal编程技术网

Python索引:复制行并在新列中添加区分信息

Python索引:复制行并在新列中添加区分信息,python,pandas,Python,Pandas,我是一个python初学者,尝试复制现有行,同时在新列中添加区分信息。目前,我的数据帧看起来是这样的: Patient Visit 1 V1 1 V2 1 V3 2 V1 2 V2 我想添加一个新列Test,对于V1需要test1,但是对于V2和V3都需要test1和test2: Patient Visit Test 1 V1 Test 1 1

我是一个python初学者,尝试复制现有行,同时在新列中添加区分信息。目前,我的数据帧看起来是这样的:

Patient  Visit
      1     V1
      1     V2
      1     V3
      2     V1
      2     V2
我想添加一个新列
Test
,对于
V1
需要
test1
,但是对于
V2
V3
都需要
test1
test2

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
,为每个测试添加
a
B
样本:

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

在附加列中添加新信息时,如何复制行?谢谢你的帮助

您可以手动创建就诊测试样本数据框,然后与患者数据框合并:

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')
输出:

   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

尝试使用explode一步一步地演示此内容:

创建DF:

      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
添加测试列:

    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]
使用“分解”将每个测试作为其自己的行:

       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
对“样本”列执行相同操作: 添加“示例”列:

      t['Sample'] = t['Test'].apply(lambda x: ['A', 'B'])
“分解”样本列:

      t = t.explode('Sample')
以下是最终输出:

         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

令人惊叹的!非常感谢,这非常有效。@Oliver,不客气。快乐编码。保持安全和健康。谢谢你的编辑。