Python 查找每列为行最小值的频率

Python 查找每列为行最小值的频率,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,看起来像: A B C D 0 1.2 0 1.1 3.2 1 2.3 2.2 2.2 2.5 2 1.1 1.5 0 1.7 3 0 1.1 1.4 1.2 4 3.3 3.0 1.7 1.7 5 1.1 1.0 2.2 2.5 6 5.0 5.0 5.0 5.0 我想找出每列包含行的最小值的频率。因此

我有一个数据框,看起来像:

       A     B     C     D
 0   1.2     0   1.1   3.2
 1   2.3   2.2   2.2   2.5
 2   1.1   1.5     0   1.7
 3     0   1.1   1.4   1.2
 4   3.3   3.0   1.7   1.7
 5   1.1   1.0   2.2   2.5
 6   5.0   5.0   5.0   5.0
我想找出每列包含行的最小值的频率。因此,以某种形式:

B: 2               # rows 0, 5
A: 1               # row 3
C: 1               # row 2
(B, C): 1          # row 1
(C, D): 1          # row 4
(A, B, C, D): 1    # row 6
我目前正在做
df.min(axis=1)
,然后使用
df.iloc
循环每一行。。。但必须有更好的办法

如果有关系的话,我有几百列,几千行,它代表一个样本,所以我必须执行大约一百万次操作。我肯定错过了一个明显的pandas或numpy方法,它既能以pythonical的方式,又能相当有效地完成这项工作。

IIUC

  • 转换数据集(使用axis使其更容易)
  • 确定每列中最小值的位置
  • 标识每个min的列名
  • 价值计算
  • IIUC

  • 转换数据集(使用axis使其更容易)
  • 确定每列中最小值的位置
  • 标识每个min的列名
  • 价值计算
  • 使用,创建一个布尔掩码,然后在
    df.columns
    上使用,然后使用此掩码计算频率:


    使用,创建一个布尔掩码,然后在
    df.columns
    上使用,然后使用此掩码计算频率:



    使用
    stack
    unstack

    df.eq(df.min(1),0).stack().loc[lambda x : x].reset_index(level=1).groupby(level=0)['level_1'].agg(tuple).value_counts()
    (B,)            2
    (C, D)          1
    (A,)            1
    (B, C)          1
    (A, B, C, D)    1
    (C,)            1
    Name: level_1, dtype: int64
    

    使用
    stack
    unstack

    df.eq(df.min(1),0).stack().loc[lambda x : x].reset_index(level=1).groupby(level=0)['level_1'].agg(tuple).value_counts()
    (B,)            2
    (C, D)          1
    (A,)            1
    (B, C)          1
    (A, B, C, D)    1
    (C,)            1
    Name: level_1, dtype: int64
    

    这几乎是我得出的完全相同的解决方案+1
    df.eq(df.min(axis=1),axis=0)。dot(df.columns)。value_counts()
    谢谢@ScottBoston;)。谢谢我怀疑这会有一个简单的答案,因此毫不奇怪,我很快就得到了各种各样的解决方法。根据我的实际数据,您的答案是发布速度最快的(几乎是发布速度的两倍),但使用最终答案需要字符串操作。你能补救一下吗?(我知道我指定了“某种格式”,我可能应该更精确一点)您希望将索引括在括号中。对吧?我想要一个理想的可折叠的。(我知道这会破坏我请求的输出——对此我深表歉意——这是我编辑请求的输出的礼节吗?)+1
    df.eq(df.min(axis=1),axis=0)。dot(df.columns)。value_counts()
    谢谢@ScottBoston;)。谢谢我怀疑这会有一个简单的答案,因此毫不奇怪,我很快就得到了各种各样的解决方法。根据我的实际数据,您的答案是发布速度最快的(几乎是发布速度的两倍),但使用最终答案需要字符串操作。你能补救一下吗?(我知道我指定了“某种格式”,我可能应该更精确一点)您希望将索引括在括号中。对吧?我想要一个理想的可折叠的。(我知道这会破坏我请求的输出——对此我深表歉意——这是我编辑请求的输出的礼节吗?)我使用了这个解决方案,因为尽管它比@ShubhamSharma的解决方案慢,但它(对我)是最直观的,并且不需要对列名进行后处理。我使用了这个解决方案,虽然它比@ShubhamSharma的解决方案慢,但它(对我来说)是最直观的,并且不需要对列名进行后处理。
    # print(freq)
    B          2
    C,D        1
    A          1
    A,B,C,D    1
    C          1
    B,C        1
    dtype: int64
    
    df.eq(df.min(1),0).stack().loc[lambda x : x].reset_index(level=1).groupby(level=0)['level_1'].agg(tuple).value_counts()
    (B,)            2
    (C, D)          1
    (A,)            1
    (B, C)          1
    (A, B, C, D)    1
    (C,)            1
    Name: level_1, dtype: int64