Python groupby mode() 在具有空、单个和多个数组长度时选择最后一项

Python groupby mode() pick last item when having empty, single and multiple array lengths

我确实检查了可能的解决方案,但最常见的解决方案没有用。

df_woningen.groupby(['postcode'], dropna=True)['energy_ranking'].agg(pd.Series.mode)

以这种格式给我多个数组:

2611BA            []
2611BB           4.0
2611BC    [3.0, 6.0]

问题:如何 select 最后一项用作新列的值?

背景:一栏有排名。每组我想采用 mode() 并将其作为该组中 NaN 的估算值。

如果有多种模式,我想取最高的。有时一个组只有 NaN,在这种情况下它应该或可以保持这样。如果一个组有 8 个 NaN 和 1 个排名“8”,那么 de mode 应该是 8,忽略 NaN。

我正在尝试使用如下代码创建一个新列:

df_woningen.groupby(['postcode'], dropna=True)['energy_ranking'].agg(
    lambda x: pd.Series.mode(x)[0])

df_woningen.groupby(['postcode'], dropna=True)['energy_ranking'].agg(lambda x:x.value_counts(dropna=True).index[0])

但是我得到了错误,我相信这是因为数组的长度不同。

TypeError: 'function' object is not subscriptable

index 0 is out of bounds for axis 0 with size 0

有人知道如何解决这个问题吗?

IIUC 您可以将 lambda 函数与 -1 一起用于列表以显示您要查找的数据

data = {
    'Column1' : ['2611BA', '2611BB', '2611BC'],
    'Column2' : [[], [4.0], [3.0, 6.0]]
}
df = pd.DataFrame(data)
df['Column3'] = df['Column2'].apply(lambda x : x[-1] if len(x) > 0 else '')
df

假设这个例子:

df = pd.DataFrame({'group': list('AAABBC'), 'value': [1,1,2,1,2,float('nan')]})
s = df.groupby('group')['value'].agg(pd.Series.mode)

输入:

group
A           1.0
B    [1.0, 2.0]
C            []
Name: value, dtype: object

您可以使用 str 访问器和 fillna:

s.str[-1].fillna(s.mask(s.str.len().eq(0)))
# or for numbers
# s.str[-1].fillna(pd.to_numeric(s, errors='coerce'))

输出:

group
A    1.0
B    2.0
C    NaN
Name: value, dtype: float64