为每个列值获取最常见的列
Get most common column for each column value
我想要每个数字最常用的字母。我尝试了很多东西;不知道什么是正确的方法。
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'}})
理想情况下,我希望最大限度地提高可读性。
使用 groupby
+ apply
+ value_counts
+ select 前 index
个值,因为值已排序。
上次转换 Series
to_frame
and remove index name by 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
>>> 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
我们可以使用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
我想要每个数字最常用的字母。我尝试了很多东西;不知道什么是正确的方法。
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'}})
理想情况下,我希望最大限度地提高可读性。
使用 groupby
+ apply
+ value_counts
+ select 前 index
个值,因为值已排序。
上次转换 Series
to_frame
and remove index name by 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
>>> 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
我们可以使用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