我有一个看起来像这样的数据框:
import pandas as pd
data = {'TABLE_NM': ['TABLE_A', 'TABLE_A', 'TABLE_A', 'TABLE_A',
'TABLE_B', 'TABLE_B', 'TABLE_B',
'TABLE_C', 'TABLE_C', 'TABLE_C', 'TABLE_C'
],
'TEST_TABLE_NM': ['TEST_TABLE_A', 'TEST_TABLE_A', 'TEST_TABLE_A', 'TEST_TABLE_A',
'TEST_TABLE_B', 'TEST_TABLE_B', 'TEST_TABLE_B',
'TEST_TABLE_C', 'TEST_TABLE_C', 'TEST_TABLE_C', 'TEST_TABLE_C'],
'TYPE': ['TEST1', 'TEST2', 'TEST3', 'TEST4', 'TEST1', 'TEST2', 'TEST3',
'TEST1', 'TEST2', 'TEST3', 'TEST4'],
'RESULTS': [1005,560,2000,2000,1005,560,2000,1005,560,135,55]
}
df = pd.DataFrame(data, columns=['TABLE_NM', 'TEST_TABLE_NM', 'TYPE', 'RESULTS'])
这将导致以下结果:
TABLE_NM TEST_TABLE_NM TYPE RESULTS
0 TABLE_A TEST_TABLE_A TEST1 1005
1 TABLE_A TEST_TABLE_A TEST2 560
2 TABLE_A TEST_TABLE_A TEST3 2000
3 TABLE_A TEST_TABLE_A TEST4 2000
4 TABLE_B TEST_TABLE_B TEST1 1005
5 TABLE_B TEST_TABLE_B TEST2 560
6 TABLE_B TEST_TABLE_B TEST3 2000
7 TABLE_C TEST_TABLE_C TEST1 1005
8 TABLE_C TEST_TABLE_C TEST2 560
9 TABLE_C TEST_TABLE_C TEST3 135
10 TABLE_C TEST_TABLE_C TEST4 55
现实中有数百种TABLE_NM / TEST_TABLE_NM组合,每个组合应与4个测试关联。但是,其中一些仅与3个测试相关联,正如您在上面使用TABLE_B所见。 我想对每个TABLE_NM和TEST_TABLE_NM组合进行操作,如果没有列出“ TEST4”,我想在“ TEST3”行之后的数据帧中插入一个虚拟行,该行的“ TEST4”列为“类型”, 0列为“结果”。因此,上面的数据框将看起来像这样:
TABLE_NM TEST_TABLE_NM TYPE RESULTS
0 TABLE_A TEST_TABLE_A TEST1 1005
1 TABLE_A TEST_TABLE_A TEST2 560
2 TABLE_A TEST_TABLE_A TEST3 2000
3 TABLE_A TEST_TABLE_A TEST4 2000
4 TABLE_B TEST_TABLE_B TEST1 1005
5 TABLE_B TEST_TABLE_B TEST2 560
6 TABLE_B TEST_TABLE_B TEST3 2000
7 TABLE_B TEST_TABLE_B TEST4 0
8 TABLE_C TEST_TABLE_C TEST1 1005
9 TABLE_C TEST_TABLE_C TEST2 560
10 TABLE_C TEST_TABLE_C TEST3 135
11 TABLE_C TEST_TABLE_C TEST4 55
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
您可以链接数据透视表以获取所有行的所有列,fillna填充丢失数据的零,堆栈以将列恢复为行,并重置索引(您可以跳过此步骤以获取表/的多索引test_table)
df=df.pivot_table(index=['TABLE_NM','TEST_TABLE_NM'], columns=['TYPE']).fillna(0).stack().reset_index()
TABLE_NM TEST_TABLE_NM TYPE RESULTS
0 TABLE_A TEST_TABLE_A TEST1 1005.0
1 TABLE_A TEST_TABLE_A TEST2 560.0
2 TABLE_A TEST_TABLE_A TEST3 2000.0
3 TABLE_A TEST_TABLE_A TEST4 2000.0
4 TABLE_B TEST_TABLE_B TEST1 1005.0
5 TABLE_B TEST_TABLE_B TEST2 560.0
6 TABLE_B TEST_TABLE_B TEST3 2000.0
7 TABLE_B TEST_TABLE_B TEST4 0.0
8 TABLE_C TEST_TABLE_C TEST1 1005.0
9 TABLE_C TEST_TABLE_C TEST2 560.0
10 TABLE_C TEST_TABLE_C TEST3 135.0
11 TABLE_C TEST_TABLE_C TEST4 55.0
如果您希望看到它的实际效果,我建议一次执行一项操作,并在每一步之间查看输出:
df=df.pivot_table(index=['TABLE_NM','TEST_TABLE_NM'], columns=['TYPE'])
df=df.fillna(0)
df=df.stack()
df=df.reset_index()