最近,我一直在使用R
颇有几分那里我会解决这个问题,如:
library(data.table)
library(dplyr)
library(tidyr)
x <- fread('
Idx Name Cheese1 Cheese2 Cheese3
0 Evan Gouda NaN NaN
1 John Cheddar Havarti Blue
2 Evan Cheddar Gouda NaN
3 John Havarti Swiss NaN', na = 'NaN')
gather(x, , Cheese, matches('Cheese'), na.rm = T) %>%
group_by(Name, Cheese) %>%
summarise(n = n()) %>%
group_by(Name) %>%
mutate(p = n/sum(n)) %>%
filter(p == max(p)) %>%
select(-n)
,输出:
Name Cheese p
(chr) (chr) (dbl)
1 Evan Gouda 0.6666667
2 John Havarti 0.4000000
我有兴趣看到Pandas中的相似事物会是怎样的。这是我想出了:
import io
import pandas as pd
x = pd.read_csv(io.StringIO('''
Idx Name Cheese1 Cheese2 Cheese3
0 Evan Gouda NaN NaN
1 John Cheddar Havarti Blue
2 Evan Cheddar Gouda NaN
3 John Havarti Swiss NaN'''), delim_whitespace=True)
tidy = pd.melt(x, ['Idx', 'Name'], value_name='Cheese').dropna()
tidy = tidy.groupby(['Name', 'Cheese']).size().reset_index(name='n')
tidy['p'] = tidy.groupby('Name')['n'].transform(lambda n: n/sum(n))
tidy[tidy['p'] == tidy.groupby('Name')['p'].transform('max')].drop('n', 1)
,输出:
Name Cheese p
1 Evan Gouda 0.666667
4 John Havarti 0.400000
绝对不是那样干净R
,但也许有人更熟悉的熊猫可以如何改善这种权衡。
你错过了一个命名函数'big_cheese'的机会 – piRSquared
这可以工作,但是当所有的人都有相同的最常见的奶酪时,它就会中断。相反,它将名称作为列标题而不是索引。有什么办法解决这个问题吗? – user3329648
我通过使用try-except语句来修复它,以获得索引或列名称,但它很笨拙,如果有人有一个更好的解决方案,我想要一个更好的解决方案。 – user3329648