根据条件/缺失数据将默认行插入Pandas Dataframe

时间:2019-02-12 19:46:38

标签: python pandas

我有一个看起来像这样的数据框:

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

关于如何实现这一目标的任何想法?

1 个答案:

答案 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()