最近,我一直在使用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