【问题标题】:Creating a python list from data frame based on conditions根据条件从数据框中创建 python 列表
【发布时间】:2019-04-24 15:38:55
【问题描述】:

我正在尝试根据数据框中列值的某些条件从 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 值的组合,这部分有效,但我希望有一个更好的解决方案,它可以完美地工作,会感谢任何帮助或对我应该遵循的方法的建议,提前致谢。

【问题讨论】:

  • 您可以创建一个新列,该列将合并两个所需的元组,然后简单地计算直方图 - 计算唯一元素
  • 这方法看起来不错,让我试试,非常感谢:)
  • 或者你可以看看stackoverflow.com/questions/35584085/…,下面的解决方案是 df.groupby(df.columns.tolist(),as_index=False).size()
  • 谢谢你,彼得 :)

标签: python pandas


【解决方案1】:

使用crosstab 将DataFrame 转换为lists:

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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多