Удаление строк по заданному условию c pandas (перечисление) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть CSV-файл с одним столбцом с именем position. Большинство строк следуют шаблону, в котором позиция столбца всегда изменяется от 1 до 6 (см., Например, строку 1-12). Однако для некоторых строк перечисление не go до 6, а уже останавливается на 4, и начинается новая строка с позицией 1. В этом случае я хочу удалить эти строки с позицией от 1 до 4 (см., Например - строка 13-16).

Example:  
index   position
row 1:  1        
row 2:  2
...
row 6:  6
row 7:  1 
...
row 12: 6  
row 13: 1
row 14: 2
row 15: 3
row 16: 4
row 17: 1
...
row 22: 6

Любые предложения приветствуются :)

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Если этот шаблон всегда сохраняется, вы можете жестко закодировать некоторые решения: всякий раз, когда вы сталкиваетесь с 1 после 4, поместите предыдущие 4 индекса в список индексов, которые вы хотите удалить. Это не самый красивый код, но он работает.

import pandas as pd

df = pd.DataFrame({'position': 
    [1,2,3,4,5,6,
    1,2,3,4,5,6,
    1,2,3,4,
    1,2,3,4,5,6]})

# every time you encounter a 1 after a 4, delete the previous four columns
index_delete = []
for index, values in enumerate(df.position.values[1:]):
    if (values == 1) and (df.position.values[1:][index - 1] == 4):
        index_delete.extend([index-3, index-2, index-1, index])

df = df.drop(index_delete)

Ввод:

df
    position
0          1
1          2
2          3
3          4
4          5
5          6
6          1
7          2
8          3
9          4
10         5
11         6
12         1
13         2
14         3
15         4
16         1
17         2
18         3
19         4
20         5
21         6

Ввод:

df
    position
0          1
1          2
2          3
3          4
4          5
5          6
6          1
7          2
8          3
9          4
10         5
11         6
16         1
17         2
18         3
19         4
20         5
21         6
0 голосов
/ 21 апреля 2020

Вы можете использовать следующий фрагмент кода для решения проблемы. Идея состоит в том, чтобы сначала найти строки с позициями 1-4, а затем создать список удаления для строк. Наконец бросьте их, и вот оно у вас.

import pandas as pd
import numpy as np

df = pd.DataFrame({
        "position": np.concatenate([
                list(range(1,7)),
                list(range(1,7)),
                list(range(1,5)),
                list(range(1,7)),
                list(range(1,5))
            ])
        })

df = df.append({'position': 1}, ignore_index=True)

df['diff_trail'] = df.position.diff()

rm_index_pos = df[df.diff_trail == -3].index - 1

# We know that 12-15 and 22-25 should be deleted

rm_index = np.ravel([list(range(i,i-4,-1)) for i in rm_index_pos])
rm_index = np.append(rm_index, df.index[-1])
print(rm_index)


df.drop(rm_index, axis=0, inplace=True) # Remove the unwanted rows.
df.drop(['diff_trail'], axis=1, inplace=True) # remove 'diff_trail' column from dataframe.

# Reset the index values.
df.reset_index(drop=True, inplace=True) 

print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...