我有一个包含两列col1
和col2
的数据帧。col1
具有字母(A和B(,而col2
具有数字(1到9(。对于输出,我需要2个字母的col1
和一些新列:
- CCD_ 6-每个字母的总数
numbers_under_5
——5以下数字计数lowest
-最低值highest
-最高值
输入:
|Col1|Col2|
|----|----|
|A |1 |
|B |1 |
|A |2 |
|A |7 |
|B |6 |
输出:
|Col1|total_numbers|numbers_under_5|lowest|highest|
|----|-------------|---------------|------|-------|
|A |3 |2 |1 |7 |
|B |2 |1 |1 |6 |
由于我们需要number less than 5
的自定义函数,因此我们不得不将groupby
拆分为两个dfs(df1和df2(,然后在Col1
上合并,最后根据需要重命名列。
df1 = df[df.groupby('Col1').Col2.apply(lambda x: x<5)].groupby('Col1').agg('last').reset_index()
df2 = df.groupby('Col1', as_index=False).Col2.agg(['count', 'min','max']).reset_index()
df = df1.merge(df2, on='Col1').rename(columns= {
'Col2':'numbers_under_5',
'count':'total_numbers',
'min':'lowest',
'max':'highest'
})
df
输出
Col1 numbers_under_5 total_numbers lowest highest
A 2 3 1 7
B 1 2 1 6
PS对于Col1
中的A
,有2个值小于5,因为在输出中您显示了2
,因此我取了最后一个值。如果您希望max value below 5
而不是last value
用于每个具有多个小于5的值的组,则可以使用以下代码。
df1 = df[df.groupby('Col1').Col2.apply(lambda x: x<5)].groupby('Col1').agg('max').reset_index()
TRY:
df1 = df.groupby('Col1').Col2.agg(['count', 'min','max', lambda x : len(x[x.astype(int) < 5])])
df1.columns = ['total_numbers', 'lowest' ,'highest' , 'numbers_under_5']
df1 = df1.reset_index()