Python 计算每个数据帧行中的发生次数,然后创建最频繁的列
我试图比较一个数据帧(500000x3)行中的三个浮点值,我希望这三个值是相同的,或者至少是其中的两个。我想在假设它们并非完全不同的情况下选择出现最多的值。我目前尝试的玩具示例如下所示: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
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