当前位置: 首页 > 知识库问答 >
问题:

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

杨轶
2023-03-14

我试图比较一个数据帧(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==NaNFalse。有什么建议吗?

共有2个答案

孙胜泫
2023-03-14

这是我从@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

现在,如果你只将列中的数字分组并求和,我们可以得到每行的值计数。也就是说

   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模式

陶原
2023-03-14

我们可以用模式...

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
 类似资料:
  • 我有一个熊猫数据框,如下所示: 我如何将每分钟的数据分组,并计算每分钟每个状态的数量,以获得此数据帧:

  • 然后,我会添加初始值,然后查看这个数据,从前面的行计算新行,例如左右。 我目前使用的代码如下所示,但我觉得它有点难看,必须有一种方法直接使用DataFrame来实现这一点,或者只是一种更好的方法。注意:我使用的是Python2.7。

  • 我从熊猫数据帧文档开始:数据结构简介 我想在一个时间序列类型的计算中迭代地填充数据帧。所以基本上,我想用列A、B和时间戳行初始化数据帧,全0或全NaN。 然后,我会添加初始值并检查这些数据,根据之前的行计算新行,比如说< code > row[A][t]= row[A][t-1]1 左右。 我目前正在使用下面的代码,但我觉得它有点难看,必须有一种方法直接用数据帧来做这件事,或者一般来说是一种更好的

  • 我有一个数据集 我希望能够返回像(显示独特的值和频率)这样的东西

  • 下面有一段代码,它创建了数据框中每列中缺失值的汇总表。我希望我可以构建一个类似的表来计算唯一的值,但是DataFrame没有唯一的()方法,只有每一列是独立的。 (资料来源:https://stackoverflow.com/a/39734251/7044473) 如何为唯一值实现相同的功能?

  • 问题内容: 我正在尝试计算中每行显示的数字,例如: 行显示3次。 一个简单的天真的解决方案将涉及将我所有的行都转换为元组,然后应用,如下所示: 产生: 但是,我担心我的方法的效率。也许有一个提供此功能的内置库。我将此问题标记为,因为我认为它可能具有我正在寻找的工具。 问题答案: 您可以使用另一个问题的答案来获得唯一项目的计数。 使用结构化数组的另一种选择是使用一种void类型的视图,该视图将整行连