[英]function to return the highest count value using a rule
我有兩個列,如下所示,並試圖返回第二列的最高計數,但它只是返回我最高的評級計數而不考慮性別
數據:
打印(df)
AGE GENDER rating
0 10 M PG
1 10 M R
2 10 M R
3 4 F PG13
4 4 F PG13
代碼:
s = (df.groupby(['AGE', 'GENDER'])['rating']
.apply(lambda x: x.value_counts().head(2))
.rename_axis(('a','b', 'c'))
.reset_index(level=2)['c'])
輸出:
print (s[F])
('PG')
print(s[M]
('PG', 'R')
以下是此文件的標准庫解決方案:
%%file "test.txt"
gender rating
M PG
M R
F NR
M R
F PG13
F PG13
特定
import collections as ct
def read_file(fname):
with open(fname, "r") as f:
header = next(f)
for line in f:
gender, rating = line.strip().split()
yield gender, rating
碼
filename = "test.txt"
dd = ct.defaultdict(ct.Counter)
for k, v in sorted(read_file(filename), key=lambda x: x[0]):
dd[k][v] += 1
{k: v.most_common(1) for k, v in dd.items()}
# {'F': [('PG13', 2)], 'M': [('R', 2)]}
細節
該文件的每一行都是解析並添加到defaultdict
。 鍵是性別,但每個性別的每個評級的值都是Counter
對象。 調用Counter.most_common()
來檢索Counter.most_common()
出現的事件。
由於數據按性別分組,因此您可以瀏覽更多信息。 例如,每個性別的唯一評級:
{k: set(v.elements()) for k, v in dd.items()}
# {'F': {'NR', 'PG13'}, 'M': {'PG', 'R'}}
我認為您需要使用groupby
+ value_counts
+ head
來計算類別和評級:
df1 = (df.groupby('gender')['rating']
.apply(lambda x: x.value_counts().head(1))
.rename_axis(('gender','rating'))
.reset_index(name='val'))
print (df1)
gender rating val
0 F PG13 2
1 M R 2
如果只想要最高評級seelct每組的索引第一個值:
s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().index[0])
print (s)
gender
F PG13
M R
Name: rating, dtype: object
print (s['M'])
R
print (s['F'])
PG13
或者只有最高計數選擇每組Series
第一個值:
s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().iat[0])
print (s)
gender
F 2
M 2
Name: rating, dtype: int64
print (s['M'])
2
print (s['F'])
2
編輯:
s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().index[0])
def gen_mpaa(gender):
return s[gender]
print (gen_mpaa('M'))
print (gen_mpaa('F'))
編輯:
解決方案,如果genre id
值是字符串:
print (type(df.loc[0, 'genre id']))
<class 'str'>
df = df.set_index('gender')['genre id'].str.split(',', expand=True).stack()
print (df)
gender
M 0 11
1 22
2 33
0 22
1 44
2 55
0 33
1 44
2 55
F 0 11
1 22
0 22
1 55
0 55
1 44
dtype: object
d = df.groupby(level=0).apply(lambda x: x.value_counts().index[0]).to_dict()
print (d)
{'M': '55', 'F': '55'}
EDIT1:
print (df)
AGE GENDER rating
0 10 M PG
1 10 M R
2 10 M R
3 4 F PG13
4 4 F PG13
s = (df.groupby(['AGE', 'GENDER'])['rating']
.apply(lambda x: x.value_counts().head(2))
.rename_axis(('a','b', 'c'))
.reset_index(level=2)['c'])
print (s)
a b
4 F PG13
10 M R
M PG
Name: c, dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.