根据条件从数据框创建python列表

时间:2019-04-24 06:29:29

标签: python pandas

我试图根据数据框中列值的某些条件从pandas数据框中生成列表,我的df看起来像

        df =      
                       48 150  39   0
        0    BE0974302342   0   0  21
        1    BE0974302342   3   3  19
        2    BE0974302342   F   2   2
        3    FR0000073843   0   0  22
        4    FR0000073843   3   3  20
        5    FR0000073843   F   2   2
        6    FR0000076861   0   0  21
        7    FR0000076861   3   3  18
        8    FR0000076861   F   1   3
        9    FR0000076861   F   2   3
        10   FR0000076887   0   0  13
        11   FR0000076887   3   3  11
        12   FR0000076887   8   8  19
        13   FR0000076887   F   2   2
        14   FR0000077562   0   0  22
        15   FR0000077562   3   3  19
        16   FR0000077562   F   2   3
        17   FR0000079147   0   0  20
        18   FR0000079147   3   3  16
        19   FR0000079147   F   1   1
        20   FR0000079147   F   2   4
        21   FR0004034072   0   0  14
        22   FR0004034072   3   3  12
        23   FR0004034072   8   8  21
        24   FR0004034072   F   2   2
        25   FR0004152874   0   0  22
        26   FR0004152874   3   3  20
        27   FR0004152874   F   1   1
        28   FR0004152874   F   2   2
        29   FR0004178572   0   0  21
        ...

第150列和第39列的组合具有含义,因此我想根据该组合提取计数,共有6种可能的组合

    150 39
    0   0
    3   3
    4   4
    8   8
    F   1
    F   2

我想形成一个final_list,其中将对列“ 48”中的每个值具有每种组合的计数,

例如

'BE0974302342', (150=0, 39=0) record count is 21, (150=3, 39=3) is 19, (150=4, 39=4) is 0, (150=8, 39=8) is 0, (150=F, 39=1) is 0, (150=F,39=2) is 2  

所以最终记录列表将类似于

[[BE0974302342,21,19,0,0,0,2], 
[FR0000073843,22,20,0,0,0,2],
[FR0000076861,21,18,0,0,1,3]...]

我尝试了什么:我尝试将df转换为列表,然后遍历每个子列表,并检查150和39值的组合,虽然部分有效,但我想有一个更好的解决方案,它将完美地工作,在此先感谢我为实现此目标而应采取的任何帮助或建议。

1 个答案:

答案 0 :(得分:2)

使用crosstab并将DataFrame转换为list s:

df1 = pd.crosstab(df[48], [df[150], df[39]])
#alternative solutions
#df1 = df.groupby([48, 150, 39]).size().unstack(level=[1,2], fill_value=0)
#df1 = df.pivot_table(index=48, columns=[150, 39], aggfunc='size', fill_value=0)
print (df1)
150           0  3  8  F   
39            0  3  8  1  2
48                         
BE0974302342  1  1  0  0  1
FR0000073843  1  1  0  0  1
FR0000076861  1  1  0  1  1
FR0000076887  1  1  1  0  1
FR0000077562  1  1  0  0  1
FR0000079147  1  1  0  1  1
FR0004034072  1  1  1  0  1
FR0004152874  1  1  0  1  1
FR0004178572  1  0  0  0  0

L = df1.reset_index().values.tolist()
print (L)

[['BE0974302342', 1, 1, 0, 0, 1], 
 ['FR0000073843', 1, 1, 0, 0, 1], 
 ['FR0000076861', 1, 1, 0, 1, 1], 
 ['FR0000076887', 1, 1, 1, 0, 1], 
 ['FR0000077562', 1, 1, 0, 0, 1], 
 ['FR0000079147', 1, 1, 0, 1, 1], 
 ['FR0004034072', 1, 1, 1, 0, 1], 
 ['FR0004152874', 1, 1, 0, 1, 1], 
 ['FR0004178572', 1, 0, 0, 0, 0]]

如果需要组合,将列中的MultiIndex转换为元组列表:

print (df1.columns.tolist())
[('0', 0), ('3', 3), ('8', 8), ('F', 1), ('F', 2)]