我试图创建一个列,当它沿着行组向下移动一列并基于另一列时,该列会递增计数.

此外,如果其中一个状态为空(如在空字符串中),它将被忽略,并重复上一个状态的空白计数.

所以我有这些数据

      car  status  
0    audi   False      
1    audi   False      
2    audi   False      
3    audi    True      
4     bmw   False     
5     bmw   ''      
6     bmw   False      
7     bmw    True      
8     bmw   False      
9   lexus    True      
10  lexus    True      
11  lexus    True

我想添加一个列,当它为每一个car计数时,计算有多少连续的False处于状态,当有一个True重新开始时,如果有另一个False或另一个car,则重置

      car  status  counter
0    audi   False  1
1    audi   False  2   
2    audi   False  3   
3    audi    True  0   
4     bmw   False  1   
5     bmw   ''     1 
5     bmw   False  2    
6     bmw    True  0    
7     bmw   False  1         
9   lexus    True  0
10  lexus    True  0   
11  lexus   False  1

我正在try 这个,但它会随着汽车的增加而增加

import pandas as pd

data = [['audi', False],
        ['audi', False],
        ['audi', False],
        ['audi', True],
        ['bmw', False],
        ['bmw', False],
        ['bmw', False],
        ['bmw', True],
        ['bmw', False],
        ['lexus', True],
        ['lexus', True],
        ['lexus', False]]

df = pd.DataFrame(data=data, columns=['car', 'status'])

df['count'] = df.groupby('car')['status'].transform(lambda x: x.ne(x.shift()).cumsum())

print(df)

推荐答案

可以使用GroupBy.cumcount对连续值进行分组,最后设置0Series.maskstatus=True个值进行分组:

s = df['status'].eq(True)
df['count'] = (df.groupby(['car', s.ne(s.shift()).cumsum()])
                 .cumcount()
                 .add(1)
                 .mask(df['status'], 0))

print(df)
      car  status  count
0    audi   False      1
1    audi   False      2
2    audi   False      3
3    audi    True      0
4     bmw   False      1
5     bmw   False      2
6     bmw   False      3
7     bmw    True      0
8     bmw   False      1
9   lexus    True      0
10  lexus    True      0
11  lexus   False      1

替代解决方案,仅适用于布尔列:

s = df['status'].eq(True)
df['count'] = (df.groupby(['car', (~s & s.shift(fill_value=False)).cumsum()])
                 .cumcount()
                 .add(1)
                 .mask(df['status'], 0))

编辑:

data = [['audi', False],        
        ['audi', False],         
        ['bmw', False],        
        ['bmw', False],        
        ['bmw', ''],         
        ['bmw', ''],         
        ['bmw', False],         
        ['bmw', True],         
        ['bmw', False],         
        ['lexus', True],         
        ['lexus', True],         
        ['lexus', False]]
df = pd.DataFrame(data=data, columns=['car', 'status'])

m = df['status'].isin([True, False])
df1 = df[m].copy()
df.loc[m, 'count'] = (df1.groupby(['car', df1['status'].ne(df1['status'].shift()).cumsum()])
                        .cumcount())

df['count'] = df.groupby('car')['count'].bfill().fillna(0).astype('int')
print(df)
      car status  count
0    audi  False      0
1    audi  False      1
2     bmw  False      0
3     bmw  False      1
4     bmw             2
5     bmw             2
6     bmw  False      2
7     bmw   True      0
8     bmw  False      0
9   lexus   True      0
10  lexus   True      1
11  lexus  False      0

Python相关问答推荐

使文本输入中的文本与标签中的文本相同

根据给定日期的状态过滤查询集

列表上值总和最多为K(以O(log n))的最大元素数

Locust请求中的Python和参数

Python在tuple上操作不会通过整个单词匹配

为什么tkinter框架没有被隐藏?

max_of_three使用First_select、second_select、

try 在树叶 map 上应用覆盖磁贴

如何更改分组条形图中条形图的 colored颜色 ?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

不能使用Gekko方程'

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

如何使用正则表达式修改toml文件中指定字段中的参数值

无法在Spyder上的Pandas中将本地CSV转换为数据帧

查看pandas字符列是否在字符串列中

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

如何使用加速广播主进程张量?

如何在Python中自动创建数字文件夹和正在进行的文件夹?

如何在Python中从html页面中提取html链接?