Python 使用Nan值统计最频繁的组

Python 使用Nan值统计最频繁的组,python,pandas,dataframe,scipy,pandas-groupby,Python,Pandas,Dataframe,Scipy,Pandas Groupby,基本上,我想计算由2个变量分组的最频繁项目的数量。我使用以下代码: dfgrouped = data[COLUMNS.copy()].groupby(['Var1','Var2']).agg(lambda x: stats.mode(x)[1]) 此代码可以工作,但不适用于具有Nan值的列,因为Nan值是float,而其他值是str。因此显示此错误: '<' not supported between instances of 'float' and 'str' 你能给我一个如何处理的

基本上,我想计算由2个变量分组的最频繁项目的数量。我使用以下代码:

dfgrouped = data[COLUMNS.copy()].groupby(['Var1','Var2']).agg(lambda x: stats.mode(x)[1])
此代码可以工作,但不适用于具有Nan值的列,因为Nan值是float,而其他值是str。因此显示此错误:

'<' not supported between instances of 'float' and 'str'
你能给我一个如何处理的建议吗。 谢谢

我认为需要删除
NaN
s:

dfgrouped = data[COLUMNS.copy()].groupby(['Var1','Var2']).agg(lambda x: stats.mode(x.dropna())[1])
如果需要为所有NaN组设置
NaN
s:

dfgrouped = (data[COLUMNS.copy()]
              .groupby(['Var1','Var2'])
              .agg(lambda x: None if x.isnull().all() else stats.mode(x.dropna())[1]))

nan的类型为float,np.nan==np.nan也为False。如果需要将它们组合在一起,可以尝试以下方法:

# First replace nan values with something like 'Unavailable'
data.fillna('Unavailable', inplace=True)
# Then re-run your code
dfgrouped = data[COLUMNS.copy()].groupby(['Var1','Var2']).agg(lambda x: stats.mode(x)[1])
这将把所有不可用项作为一个组分组。希望这对你有帮助 在执行
groupby
之前,可以将
dropna
作为初始步骤。如果您试图在聚合中
dropna
,则具有所有
NaN
值的组可能会在
stats.mode
中产生错误

下面是一个简单的例子:

import pandas as pd
import numpy as np
from scipy import stats

df = pd.DataFrame([[1, 2, np.nan], [1, 2, 'hello'], [1, 2, np.nan],
                   [5, 6, 'next'], [5, 6, np.nan], [5, 6, 'next'],
                   [7, 8, np.nan], [7, 8, np.nan], [7, 8, np.nan]],
                  columns=['Var1', 'Var2', 'Value'])

res = df.dropna(subset=['Value'])\
        .groupby(['Var1', 'Var2'])\
        .agg(lambda x: stats.mode(x)[1][0])

print(res)

           Value
Var1 Var2       
1    2         1
5    6         2
捕获索引器 如果需要保留包含所有
NaN
值的组,则可以捕获
索引器

def mode_calc(x):
    try:
        return stats.mode(x.dropna())[1][0]
    except IndexError:
        return np.nan

res = df.groupby(['Var1', 'Var2'])\
        .agg(mode_calc)

print(res)

           Value
Var1 Var2       
1    2       1.0
5    6       2.0
7    8       NaN

我不想删除只有Nan值的组。如果发生这种情况,则模式应为空。所以我尝试了您的第一个帮助(stats.mode(x.dropna())[1]),但它只在没有[1]的情况下工作。你有什么建议吗?很遗憾,我不想删除只有NaN值的组。如果发生这种情况,则模式应为空。有什么建议吗?非常感谢@hta,当然,看看我添加的替代方案。
def mode_calc(x):
    try:
        return stats.mode(x.dropna())[1][0]
    except IndexError:
        return np.nan

res = df.groupby(['Var1', 'Var2'])\
        .agg(mode_calc)

print(res)

           Value
Var1 Var2       
1    2       1.0
5    6       2.0
7    8       NaN