Python Pandas groupby with agg() nth() and/or iloc()
Python Pandas groupby with agg() nth() and/or iloc()
鉴于此 DF:
df = pd.DataFrame({'Col1':['A','A','A','B','B','B','B']
, 'Col2':['i', 'j', 'k', 'l', 'm', 'n', 'o']
, 'Col3':['Apple', 'Peach', 'Apricot', 'Dog', 'Cat', 'Mouse', 'Horse']
,})
df
然后使用此代码:
df1 = df.groupby('Col1').agg({'Col2':'count', 'Col3': lambda x: x.iloc[2]})
df1
我得到了这个结果:
我现在想要什么:
在处理错误时能够使 lambda 函数 'Col3': lambda x: x.iloc[0]
变为 print('Not enough data')
例如,如果我更改 "x.iloc[0]" 到 "x.iloc[3]" 引发错误,因为 "Col1['A'][=38 中没有足够的数据=] 与“Col1['B']”相比。
!!不想使用 'last' 因为这是为了目的而简化和缩短的 DF !!
您可以使用 nth
,如果缺少该值,它会给您一个 NaN。不幸的是,nth
没有被 agg
处理,所以你需要单独计算它并加入:
g = df.groupby('Col1')
df1 = g.agg({'Col2':'count'}).join(g['Col3'].nth(3))
输出:
Col2 Col3
Col1
A 3 NaN
B 4 Horse
您可以尝试使用切片对象,如果 none 值,它将 return 清空系列。
df1 = df.groupby('Col1').agg({'Col2':'count',
'Col3': lambda x: x.iloc[3:4] if len(x.iloc[3:4]) else pd.NA})
print(df1)
Col2 Col3
Col1
A 3 <NA>
B 4 Horse
如果您的 Python 版本高于 3.8
,您可以使用命名表达式节省输入
df1 = df.groupby('Col1').agg({'Col2':'count',
'Col3': lambda x: v if len(v := x.iloc[3:4]) else pd.NA})
鉴于此 DF:
df = pd.DataFrame({'Col1':['A','A','A','B','B','B','B']
, 'Col2':['i', 'j', 'k', 'l', 'm', 'n', 'o']
, 'Col3':['Apple', 'Peach', 'Apricot', 'Dog', 'Cat', 'Mouse', 'Horse']
,})
df
然后使用此代码:
df1 = df.groupby('Col1').agg({'Col2':'count', 'Col3': lambda x: x.iloc[2]})
df1
我得到了这个结果:
我现在想要什么:
在处理错误时能够使 lambda 函数 'Col3': lambda x: x.iloc[0]
变为 print('Not enough data')
例如,如果我更改 "x.iloc[0]" 到 "x.iloc[3]" 引发错误,因为 "Col1['A'][=38 中没有足够的数据=] 与“Col1['B']”相比。
!!不想使用 'last' 因为这是为了目的而简化和缩短的 DF !!
您可以使用 nth
,如果缺少该值,它会给您一个 NaN。不幸的是,nth
没有被 agg
处理,所以你需要单独计算它并加入:
g = df.groupby('Col1')
df1 = g.agg({'Col2':'count'}).join(g['Col3'].nth(3))
输出:
Col2 Col3
Col1
A 3 NaN
B 4 Horse
您可以尝试使用切片对象,如果 none 值,它将 return 清空系列。
df1 = df.groupby('Col1').agg({'Col2':'count',
'Col3': lambda x: x.iloc[3:4] if len(x.iloc[3:4]) else pd.NA})
print(df1)
Col2 Col3
Col1
A 3 <NA>
B 4 Horse
如果您的 Python 版本高于 3.8
,您可以使用命名表达式节省输入df1 = df.groupby('Col1').agg({'Col2':'count',
'Col3': lambda x: v if len(v := x.iloc[3:4]) else pd.NA})