检测数据帧列中的连续重复而不进行迭代

2024-04-24 22:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,根据this answer,最好不要迭代数据帧中的行。但是,如果不使用for循环,我不知道如何解决我的问题。你知道吗

我需要检测特定列中的任何连续重复(三次或更多次)。例如,如果值0出现在特定ID的三个连续行中,我想知道ID

ID     Value
1       0
1       0.5
1       0   <--- I need this ID, because there are three consecutive 0s.
1       0
1       0
1       0.2
2       0.1
2       0   <--- Not this one! It only appears twice in a row for this ID.
2       0
3       0
3       0

也许值得一提的是,这是一个时间序列,所以顺序是至关重要的。你知道吗


Tags: 数据answeridforvaluenotitneed
3条回答

第一个断言是对id进行排序。你知道吗

步骤:

1-排序数据帧。你知道吗

2-将索引列放入新列以测试连续性。你知道吗

3-基于元组(id,Value)将数据帧拆分为多个数据帧。你知道吗

4-在所有数据帧上循环(这不是资源消耗)。你知道吗

5-匹配条件并获取ID

import pandas 

df = pandas.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3], 
                       'value': [0.5, 0, 0, 0, 0.1, 0, 0, 0.3, 0, 0]}
                        )


df.sort_values(by=['id']).reset_index(drop=True)
df['cons'] = df.index
CONST_VALUE = 0

d = dict(tuple(df.groupby(['id', 'value'])))

def is_consecutive(list_):
    setl = set(list_)
    return len(list_) == len(setl) and setl == set(range(min(list_), max(list_)+1))

for k, v in d.items(): 
    if (k[1]==CONST_VALUE and len(v)>=3 and is_consecutive(v['cons'].to_list())): 
        print('wanted ID : {}'.format(k[0]))

输出:

wanted ID : 1

你可以这样做:

f = lambda x:np.diff(np.r_[0,np.flatnonzero(np.diff(x))+1,x.size])[0]
df[(df[['ID','Value']].ne(df[['ID','Value']].shift()).cumsum()
          .groupby(['ID','Value'])['Value'].transform(f).ge(3))]

   ID  Value
2   1    0.0
3   1    0.0
4   1    0.0

这不是一个小问题,需要双groupby,类似于@anky91的解决方案:

# a little different df
df = pd.DataFrame({'ID': [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3],
 'Value': [0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.1, 0.0, 0.0, 0.0]})

# we want to know where the differences in Value happen
s = df.groupby('ID').Value.transform(lambda x: x.ne(x.shift(-1)) )

# groupby ID and these differences block
# cumsum helps isolate these blocks
idx = s.groupby([df['ID'], s.cumsum()]).cumcount().eq(2)

提供:

0     False
1     False
2     False
3     False
4      True
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
dtype: bool

你可以提取

df.loc[idx, 'ID'].unique()

相关问题 更多 >