Python索引:复制行并在新列中添加区分信息
我是一个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
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,不客气。快乐编码。保持安全和健康。谢谢你的编辑。