我有一个数据帧df,如下所示:


import pandas as pd

data = {'A': ['XYZ', 'XYZ', 'XYZ', 'XYZ', 'PQR', 'PQR', 'PQR', 'PQR', 'CVB', 'CVB', 'CVB', 'CVB'], 'B': ['2022-02-16 14:00:31', '2022-02-16 16:11:26', '2022-02-16 17:31:26',
                                                                                           '2022-02-16 22:47:46', '2022-02-17 07:11:11', '2022-02-17 10:43:36', 
                                                                                           '2022-02-17 15:05:11', '2022-02-18 18:06:12', '2022-02-19 09:05:46', 
                                                                                           '2022-02-19 13:02:16', '2022-02-19 18:05:26', '2022-02-19 22:05:26'], 'C': [1,0,0,0,1,0,1,0,0,0,0,1]}
df = pd.DataFrame(data)
df['B'] = pd.to_datetime(df['B'])
df


     |   A   |          B           |     C      |         
     +-------+----------------------+------------+
     |  XYZ  |  2022-02-16 14:00:31 |     1      |
     |  XYZ  |  2022-02-16 16:11:26 |     0      |
     |  XYZ  |  2022-02-16 17:31:26 |     0      |
     |  XYZ  |  2022-02-16 22:47:46 |     0      |
     |  PQR  |  2022-02-17 07:11:11 |     1      |
     |  PQR  |  2022-02-17 10:43:36 |     0      |
     |  PQR  |  2022-02-17 15:05:11 |     1      |
     +-------+----------------------+------------+


我想要实现的是对1和0的出现次数进行计数,并将计数值指定为DataFrame df的新列,并添加ID作为新列,以便预期的输出应如下所示.例如,在列C中,用于前四行的图案1,0,0,0的计数为4,并且类似地,在最后一行中仅存在计数为1的值1.


Expected Output :

     |   A   |          B           |     C      |  Count   |    ID   |            
     +-------+----------------------+------------+----------+---------+
     |  XYZ  |  2022-02-16 14:00:31 |     1      |     4    |  ABC_1  |
     |  XYZ  |  2022-02-16 16:11:26 |     0      |     NaN  |         |
     |  XYZ  |  2022-02-16 17:31:26 |     0      |     NaN  |         |
     |  XYZ  |  2022-02-16 22:47:46 |     0      |     NaN  |         |
     |  PQR  |  2022-02-17 07:11:11 |     1      |     2    |  ABC_2  | 
     |  PQR  |  2022-02-17 10:43:36 |     0      |     NaN  |         |
     |  PQR  |  2022-02-17 15:05:11 |     1      |     1    |  ABC_3  |
     +-------+----------------------+------------+----------+---------+

目前,我正试图通过使用下面的代码来实现相同的效果,但我无法获得预期的/期望的结果.


one_index = df[df['C'] == 1].index
zero_index = df[df['C'] == 0].index

df.loc[0, 'Count'] = len(df)
df.loc[one_index, 'ID'] = "ABC_1"

Actual Output :

     |   A   |          B           |     C      |  Count   |   ID   |                  
     +-------+----------------------+------------+----------+--------+
     |  XYZ  |  2022-02-16 14:00:31 |     1      |     7    |  ABC_1 |
     |  XYZ  |  2022-02-16 16:11:26 |     0      |    NaN   |        |
     |  XYZ  |  2022-02-16 17:31:26 |     0      |    NaN   |        |
     |  XYZ  |  2022-02-16 22:47:46 |     0      |    NaN   |        |
     |  PQR  |  2022-02-17 07:11:11 |     1      |    NaN   |  ABC_1 |
     |  PQR  |  2022-02-17 10:43:36 |     0      |    NaN   |        |
     |  PQR  |  2022-02-17 15:05:11 |     1      |    NaN   |  ABC_1 |
     +-------+----------------------+------------+----------+--------+

我如何计算Pandas 数据框中1和0的出现次数?

推荐答案

IIUC,您可以用C上的cumsum来创建组,然后用groupby.transform来分配size.然后再次使用cumsum来分配ABC_X,其中X是组号加上删除C中带0的行的位置.

gr = df['C'].cumsum()
m = df['C'].eq(1)
df.loc[m, 'Count'] = df.groupby(gr).transform('size')
df['ID'] = ('ABC_'+gr.astype(str)).where(m,'')
print(df)
#       A                   B  C  Count     ID
# 0   XYZ 2022-02-16 14:00:31  1    4.0  ABC_1
# 1   XYZ 2022-02-16 16:11:26  0    NaN       
# 2   XYZ 2022-02-16 17:31:26  0    NaN       
# 3   XYZ 2022-02-16 22:47:46  0    NaN       
# 4   PQR 2022-02-17 07:11:11  1    2.0  ABC_2
# 5   PQR 2022-02-17 10:43:36  0    NaN       
# 6   PQR 2022-02-17 15:05:11  1    5.0  ABC_3
# 7   PQR 2022-02-18 18:06:12  0    NaN       
# 8   CVB 2022-02-19 09:05:46  0    NaN       
# 9   CVB 2022-02-19 13:02:16  0    NaN       
# 10  CVB 2022-02-19 18:05:26  0    NaN       
# 11  CVB 2022-02-19 22:05:26  1    1.0  ABC_4

注意:OP在整个数据帧上使用groupby.transform时出现问题,因此

df.loc[m, 'Count'] = df.groupby(gr).transform('size')

可替换为:

df.loc[m, 'Count'] = gr.groupby(gr).transform('size') #or count instead of size

Python-3.x相关问答推荐

CONNEXION.EXCEPTIONS.ResolverError:运行pyz文件时未命名模块

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

PythonPandas 创建一个列并添加到DataFrame

谁能解释一下这个带邮编的多功能环路?

当条件第一次出现时将行标记为True,如果按顺序重复则标记为False

如何获取实例化 `types.GenericAlias` 的下标类?

为什么不能用格式字符串 '-' 绘制点?

SMTP 库 Python3:不太安全的应用程序访问

使用 python-binance 时,heroku [regex._regex_core.error: bad escape \d at position 7] 出错

在python中循环处理时并行写入文件

从 Python2 到 Python3 的这种解包行为的变化是什么?

在气流中运行 DAG 时出现处理信号:ttou消息

Pytorch 的随机 Select ?

如何通过python打开文件

Python 3.9.8 使用 Black 并导入 `typed_ast.ast3` 失败

python 3.4版不支持'ur'前缀

Asyncio RuntimeError:事件循环已关闭

如何将 cv2.imread 匹配到 keras image.img_load 输出

在 Python 3 中调用 super() 的 4 种方法中的哪一种?

为什么排序列表比未排序列表大