使用函数和下一列中的数据来计算一列的行数



我有一个包含两列col1col2的数据帧。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()

最新更新