Python 计算每个数据帧行中的发生次数,然后创建最频繁的列

Python 计算每个数据帧行中的发生次数,然后创建最频繁的列,python,pandas,vectorization,Python,Pandas,Vectorization,我试图比较一个数据帧(500000x3)行中的三个浮点值,我希望这三个值是相同的,或者至少是其中的两个。我想在假设它们并非完全不同的情况下选择出现最多的值。我目前尝试的玩具示例如下所示: mydf a b c 0 1 1 2 1 3 3 3 2 1 3 3 3 4 5 4 3 4 5 5 mydft = mydf.transpose() counts=[] for col in mydft: counts.append

我试图比较一个数据帧(500000x3)行中的三个浮点值,我希望这三个值是相同的,或者至少是其中的两个。我想在假设它们并非完全不同的情况下选择出现最多的值。我目前尝试的玩具示例如下所示:

mydf
   a  b  c
0  1  1  2
1  3  3  3
2  1  3  3
3  4  5  4
3  4  5  5



mydft = mydf.transpose()
    counts=[]
    for col in mydft:
        counts.append(mydft[col].value_counts())
然后我考虑循环计数,并为每个计数选择最高值,但这非常缓慢,而且感觉不舒服。我也试过:

truth = mydf['a'] == mydf['b']

为了保持计算结果为真的行,并对那些不为真的行做一些处理,但我在真实的行中有1000个NaN值,显然
NaN==NaN
False
。有什么建议吗?

这里是我从@coldspeed中学到的一个快速方法

dummies = pd.get_dummies(df.astype(str)).groupby(by=lambda x: x.split('_')[1], axis=1).sum()

df['new'] = dummies.idxmax(1)

   a  b  c new
0  1  1  2   1
1  3  3  3   3
2  1  3  3   3
3  4  5  4   4
3  4  5  5   5
说明

我们可以使用
pd.get\u dummies
对每列中的项目进行一次热编码,因为get\u dummies不会接受数字,所以我们必须将它们转换为字符串

pd.get_dummies(df.astype(str))

   a_1  a_3  a_4  b_1  b_3  b_5  c_2  c_3  c_4  c_5
0    1    0    0    1    0    0    1    0    0    0
1    0    1    0    0    1    0    0    1    0    0
2    1    0    0    0    1    0    0    1    0    0
3    0    0    1    0    0    1    0    0    1    0
3    0    0    1    0    0    1    0    0    0    1
现在,如果只对列中的数字进行分组并求和,我们可以得到每行的值计数。i、 e

   1  2  3  4  5
0  2  1  0  0  0
1  0  0  3  0  0
2  1  0  2  0  0
3  0  0  0  2  1
3  0  0  0  1  2
在一个热编码上使用
idxmax(axis=1)
将获得列名,这是行中所需的最大重复数

0    1
1    3
2    3
3    4
3    5
dtype: object
编辑

如果您的数据帧中有字符串,那么选择速度比任何东西都快的
get_dummies
,如果您有数字,则必须选择
scipy模式
pandas模式

我们可以使用

在把它分配回来之后

df['new']=value
df
Out[183]: 
   a  b  c  new
0  1  1  2    1
1  3  3  3    3
2  1  3  3    3
3  4  5  4    4
3  4  5  5    5

将NaN改为None…多谢您的评论,但我必须承认我不明白最终结果是我想要的,但我不确定上面的矩阵是什么,命令本身也让我困惑,我将阅读有关假人的内容并尝试理解您的答案。别担心,我现在将解释这是如何工作的:)。给我一个minute@seanysull在线阅读一个热门编码。这是我现在能解释的最好的了。希望能有帮助。祝你过得愉快。非常感谢。今天下午我将满怀希望地读一读。上帝啊,我忘了那本书有多傻。@Dark,我会说咖啡帮了我大忙。:-)也许
df.mode(1)
@Dark可以实现它,但我将与scipy叠加,以防他需要
count
值:-)这是一个非常简单的方法。
df['new']=value
df
Out[183]: 
   a  b  c  new
0  1  1  2    1
1  3  3  3    3
2  1  3  3    3
3  4  5  4    4
3  4  5  5    5