我有以下df
,
type id date code
exact 9720 2017-10-01 515
exact 9720 2017-10-01 515
fuzzy 8242 2017-11-01 122
fuzzy 8242 2017-11-01 122
我正在尝试
exact_rows = df['type'] != 'fuzzy'
grouped = df.loc[~exact_rows].groupby('id').apply(
lambda g: g.sort_values('date', ascending=True))
a = np.where(grouped['code'].transform('nunique') == 1, 20, 0)
但我遇到了错误,
ValueError: transforms cannot produce aggregated results
我想知道如何解决该问题。
答案 0 :(得分:2)
IIUC,您必须在groupby对象中使用transform,因此只需使用现有的任何索引重新组合
grouped.groupby(grouped.index)['code'].transform('nunique')
答案 1 :(得分:1)
问题是groupby.apply
返回DataFrame
,而不是DataFrameGroupBy
对象:
grouped = df.loc[~exact_rows].groupby('id').apply(
lambda g: g.sort_values('date', ascending=True))
print (grouped)
type id date code
id
8242 2 fuzzy 8242 2017-11-01 122
3 fuzzy 8242 2017-11-01 122
因此,按组对值进行排序的解决方案是在groupby('id')
之前的两列中使用DataFrame.sort_values
:
exact_rows = df['type'] != 'fuzzy'
grouped = df.loc[~exact_rows].sort_values(['id','date'], ascending=True).groupby('id')
a = np.where(grouped['code'].transform('nunique') == 1, 20, 0)
print (a)
[20 20]