我正在尝试比较(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 == NaN
是False
。有什么建议吗?
答案 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 mode
或pandas mode