pandas 在一个 Dataframe 中搜索具有相同值的N个连续行

dgjrabp2  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(167)

我需要创建一个python代码来搜索"N"作为变量,在一个列 Dataframe 中具有相同值和不同值的连续行NaN,就像这样。我不知道如何用for循环来做,因为我不知道在每种情况下我在看哪一行。有什么想法可以做到这一点吗?
| 水果|2次匹配|5次匹配|
| - ------|- ------|- ------|
| 苹果|没有|没有|
| 钠氮|没有|没有|
| 梨|没有|没有|
| 梨|是的|没有|
| 梨|是的|没有|
| 梨|是的|没有|
| 梨|是的|是的|
| 钠氮|没有|没有|
| 钠氮|没有|没有|
| 钠氮|没有|没有|
| 钠氮|没有|没有|
| 钠氮|没有|没有|
| 香蕉|没有|没有|
| 香蕉|是的|没有|

    • 更新:@Corralian测试解决方案**
counts = (df.groupby(df['Fruit'].ne(df['Fruit'].shift()).cumsum()) # virtual groups
            .transform('cumcount').add(1)  # cumulative counter
            .where(df['Fruit'].notna(), other=0))  # set NaN to 0
N = 2
df['Matches'] = df.where(counts >= N, other='No')

执行最后一行时,VSCode向我返回"单步调试期间跳过帧"消息,并在上一个for循环中生成异常。

f87krz0w

f87krz0w1#

计算连续值并将NaN设置为0。计算出累积计数器后,只需检查计数器是否大于或等于N

counts = (df.groupby(df['Fruit'].ne(df['Fruit'].shift()).cumsum()) # virtual groups
            .transform('cumcount').add(1)  # cumulative counter
            .where(df['Fruit'].notna(), other=0))  # set NaN to 0

N = 2
df['2 matches'] = counts.ge(N).replace({True: 'Yes', False: 'No'})

N = 5
df['5 matches'] = counts.ge(N).replace({True: 'Yes', False: 'No'})

输出:

>>> df
     Fruit 2 matches 5 matches
0    Apple        No        No
1      NaN        No        No
2     Pear        No        No
3     Pear       Yes        No
4     Pear       Yes        No
5     Pear       Yes        No
6     Pear       Yes       Yes
7      NaN        No        No
8      NaN        No        No
9      NaN        No        No
10     NaN        No        No
11     NaN        No        No
12  Banana        No        No
13  Banana       Yes        No

>>> counts
0     1
1     0
2     1
3     2
4     3
5     4
6     5
7     0
8     0
9     0
10    0
11    0
12    1
13    2
dtype: int64
    • 更新**

例如,如果我需要将水果名称更改为"是"

N = 2
df['2 matches'] = df.where(counts >= N, other='No')
print(df)

# Output
     Fruit 2 matches
0    Apple        No
1      NaN        No
2     Pear        No
3     Pear      Pear
4     Pear      Pear
5     Pear      Pear
6     Pear      Pear
7      NaN        No
8      NaN        No
9      NaN        No
10     NaN        No
11     NaN        No
12  Banana        No
13  Banana    Banana

相关问题