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

时间:2017-12-14 14:34:47

标签: python pandas vectorization

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

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 == NaNFalse。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我们可以使用mode ...

from scipy import stats


value,count=stats.mode(df.values,axis=1)
value
Out[180]: 
array([[1],
       [3],
       [3],
       [4],
       [5]], dtype=int64)


count
Out[181]: 
array([[2],
       [3],
       [2],
       [2],
       [2]])

分配后

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

答案 1 :(得分:2)

这是我从@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_dummies获取每列中存在的项目的热门编码,因为get_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

现在,如果您只对列中的数字进行分组并对它们求和,我们就可以获得每行的值计数。即

   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 modepandas mode