2

我想要每个数字最常见的字母。我尝试了各种各样的东西;不知道什么是正确的方法。

import pandas as pd
from pandas import DataFrame, Series

original = DataFrame({
    'letter': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}, 
    'number': {0: '01', 1: '01', 2: '02', 3: '02', 4: '02'}
})

expected = DataFrame({'most_common_letter': {'01': 'A', '02': 'B'}})

理想情况下,我希望最大限度地提高可读性。

4

3 回答 3

2

我们可以使用DataFrame.mode()方法:

In [43]: df.groupby('number')[['letter']] \
           .apply(lambda x: x.mode()) \
           .reset_index(level=1, drop=True)
Out[43]:
       letter
number
01          A
02          B
于 2017-06-07T07:41:46.197 回答
2

使用groupby++apply选择value_counts第一个index值,因为值是排序的。

最后通过以下方式转换Series to_frame和删除索引名称rename_axis

df = original.groupby('number')['letter'] \
             .apply(lambda x: x.value_counts().index[0])
             .to_frame('most_common_letter')
             .rename_axis(None)
print (df)
   most_common_letter
01                  A
02                  B

类似的解决方案:

from collections import Counter

df = original.groupby('number')['letter'] \
             .apply(lambda x: Counter(x).most_common(1)[0][0]) \
             .to_frame('most_common_letter') \
             .rename_axis(None)
print (df)
   most_common_letter
01                  A
02                  B

或使用Series.mode

df = original.groupby('number')['letter'] \
             .apply(lambda x: x.mode()[0][0])
             .to_frame('most_common_letter')
             .rename_axis(None)
print (df)
   most_common_letter
01                  A
02                  B
于 2017-06-07T05:09:48.630 回答
1
>>> df = pd.DataFrame({
    'letter': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}, 
    'number': {0: '01', 1: '01', 2: '02', 3: '02', 4: '02'}})
>>> df['most_common_letter']=df.groupby('number')['letter'].transform(max) 
>>> df = df.iloc[:,1:].drop_duplicates().set_index('number')
>>> df.index.name = None
>>> df
   most_common_letter
01                  A
02                  B

或者这样,如果它有助于可读性:

>>> df['most_common_letter']=df.groupby('number')['letter'].transform(max) 
>>> df = df.drop('letter', axis=1).drop_duplicates().rename({'number': None}).set_index('number')
>>> df
   most_common_letter
01                  A
02                  B
于 2017-06-07T05:20:36.650 回答