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
我确实检查了可能的解决方案,但最常见的解决方案没有用。
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