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
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;)。谢谢我怀疑这会有一个简单的答案,因此毫不奇怪,我很快就得到了各种各样的解决方法。根据我的实际数据,您的答案是发布速度最快的(几乎是发布速度的两倍),但使用最终答案需要字符串操作。你能补救一下吗?(我知道我指定了“某种格式”,我可能应该更精确一点)您希望将索引括在括号中。对吧?我想要一个理想的可折叠的。(我知道这会破坏我请求的输出——对此我深表歉意——这是我编辑请求的输出的礼节吗?)+1df.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