Pandas:检查一个数字是否多次出现在

2024-06-02 05:03:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个如下所示的数据帧。我想要的是,如果a、b、c列之间的一个数出现最多,那么它应该输出这个数,或者如果这三个数都不同,那么取a的数。例如,在第一行中,1在1和5中出现最多,那么在d中的输出是1。但在第二行,a、b、c列的11、2、7三个数字都不同,输出是a(11)列的值,所以d中的输出是11

list   a  b   c  
 1     1  5   1 
11    11  2   7 
 0     0  0   0 
 9     5  9   5 
 8     8  2   7  

预期产量

^{pr2}$

Tags: 数据数字list产量pr2
3条回答

这是我的bincount解决方案

数据
请注意,这与OP不同,它指出它是按预期工作的。在

   list   a  b  c
0     1   5  1  1
1    11  11  2  7
2     0   0  0  0
3     9   5  9  5
4     8   8  2  7

解决方案

^{pr2}$

详细信息

得到我们想要的值的numpy数组。在

v = df.values[:, 1:]

使用enumerate和comprehension创建元组列表。每一行的值都不同于其他行,因为我在每一行的元组的第一个位置放置了一个标识符。即枚举的值。然后我将这些传递到Pandas的factorize函数中,以便放入Numpy的bincount。在

f, u = pd.factorize([(i, e) for i, row in enumerate(v) for e in row])

现在我在f上使用bincount并用f对其进行切片,以得到一个大小相同但现在填充了计数值的数组。在

counts = np.bincount(f)[f].reshape(v.shape)

我找到最大值,并对原始数组进行切片,以获取这些值的位置。在

x = (counts == counts.max(1, keepdims=1)).argmax(1)
y = np.arange(v.shape[0])

请注意,如果所有值都相同或存在多个模式,argmax将选择第一个。当所有内容都相同时,这是列a。在

df.assign(d=v[y, x])

scipy计算模式,但我很惊讶没有在numpy中找到这个。在

import pandas as pd
import numpy as np
from scipy import stats

df = pd.DataFrame([[1, 1, 5, 1],
                   [11, 11, 2, 7],
                   [0, 0, 0, 0],
                   [9, 5, 9, 5],
                   [8, 8, 2, 7]],
                  columns=['list', 'a', 'b', 'c'])

df['d'], df['count'] = stats.mode(df[['a', 'b', 'c']].values, axis=1)
df.loc[df['count'] == 1, 'd'] = df['a']
df = df.drop('count', 1)

您可以使用value_counts

df.iloc[:,1:].apply(lambda x : x.value_counts().index[0] if x.value_counts().iloc[0]>1 else x['a'] ,1)
Out[1046]: 
0     1
1    11
2     0
3     5
4     8
dtype: int64

相关问题 更多 >