2024-06-02 05:03:08 发布
网友
假设我有一个如下所示的数据帧。我想要的是,如果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
预期产量
这是我的bincount解决方案
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
解决方案
详细信息
得到我们想要的值的numpy数组。在
v = df.values[:, 1:]
使用enumerate和comprehension创建元组列表。每一行的值都不同于其他行,因为我在每一行的元组的第一个位置放置了一个标识符。即枚举的值。然后我将这些传递到Pandas的factorize函数中,以便放入Numpy的bincount。在
enumerate
factorize
f, u = pd.factorize([(i, e) for i, row in enumerate(v) for e in row])
现在我在f上使用bincount并用f对其进行切片,以得到一个大小相同但现在填充了计数值的数组。在
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。在
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
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
这是我的
bincount
解决方案数据
请注意,这与OP不同,它指出它是按预期工作的。在
解决方案
^{pr2}$详细信息
得到我们想要的值的numpy数组。在
使用
enumerate
和comprehension创建元组列表。每一行的值都不同于其他行,因为我在每一行的元组的第一个位置放置了一个标识符。即枚举的值。然后我将这些传递到Pandas的factorize
函数中,以便放入Numpy的bincount
。在现在我在
f
上使用bincount
并用f
对其进行切片,以得到一个大小相同但现在填充了计数值的数组。在我找到最大值,并对原始数组进行切片,以获取这些值的位置。在
请注意,如果所有值都相同或存在多个模式,
argmax
将选择第一个。当所有内容都相同时,这是列a
。在scipy计算模式,但我很惊讶没有在numpy中找到这个。在
您可以使用
value_counts
相关问题 更多 >
编程相关推荐