Как удалить все строки, которые выше индекса указанной c строки в pandas? - PullRequest
1 голос
/ 07 августа 2020

Я хочу удалить все строки над строкой с указанным c значением в столбце. Если это значение c существует несколько раз, последнее совпадение определяет удаление. Фрейм данных выглядит следующим образом:

df =

      A             B          C         
0     Item1         20         5   
1     Item2         84         0  
2     Item3         93         1 
3     Item4         50         0
4     Item5         40         3
5     Item6          1         12

Сначала я идентифицирую все строки со значением «0» в столбце C. Я беру последний. Затем я пытаюсь удалить все строки выше, включая совпадающую.

c_zero_rows = df[ df["C"] == 0 ] # get all rows with value "0" in C
last_c_zero_row = c_zero_rows.tail(1) # get last of this rows

remaining_rows = df [ df.index > last_c_zero_row.index] # remove all rows above

Мой желаемый результат должен выглядеть так:

remaining rows =

      A             B          C         
4     Item5         40         3
5     Item6          1         12

К сожалению, я получаю сообщение об ошибке:

/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in cmp_method(self, other)
    103         if isinstance(other, (np.ndarray, Index, ABCSeries, ExtensionArray)):
    104             if other.ndim > 0 and len(self) != len(other):
--> 105                 raise ValueError("Lengths must match to compare")
    106 
    107         if is_object_dtype(self) and isinstance(other, ABCCategorical):

ValueError: Lengths must match to compare

Пробовал решить эту проблему уже несколькими способами. Как мне подойти к этому?

Ответы [ 2 ]

1 голос
/ 07 августа 2020
df = pd.DataFrame({
    'A':['tem1','item2','item3','item4','item5','item6'],
    'B':[20,84,93,50,40,1],
'C':[5,0,1,0,3,12],

                   })

print(df)
       A   B   C
0   tem1  20   5
1  item2  84   0
2  item3  93   1
3  item4  50   0
4  item5  40   3
5  item6   1  12
df['check'] = df['C'].astype(str).str.extract('(^0$)')
df['check']=df['check'].bfill()
df=df[df.check.isna()]
del df['check']
print(df)
       A   B   C
4  item5  40   3
5  item6   1  12
1 голос
/ 07 августа 2020

Переверните столбец C, затем используйте Series.ne + Series.cummin для создания логической маски m, затем используйте эту маску для фильтрации строк в кадре данных:

m = df.loc[::-1, 'C'].ne(0).cummin()[::-1]
df1 = df[m]

Подробнее:

print(m)
0    False
1    False
2    False
3    False
4     True
5     True
Name: C, dtype: bool

print(df1)
       A   B   C
4  Item5  40   3
5  Item6   1  12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...