Python Pandas вызываемые скипроузы, не берущие индекс из index_col - PullRequest
1 голос
/ 05 мая 2020

Необработанные данные выглядят так:

data = "i,a,b\ngood,1,2\nbad,3,a"
df = pd.read_csv(StringIO(data))

  i    a b
--------------
0 good  1 2
1 bad   3 a

Строки правильно пропущены с индексом по умолчанию:

pd.read_csv(StringIO(data), skiprows=lambda index: 2 == index)

    i    a  b
0   good 1  2

Но, когда я установил свой собственный индекс с index_col, похоже, что это не работает (строка не пропускается).

pd.read_csv(StringIO(data), index_col='i', skiprows=lambda index: 'bad' == index)

1 Ответ

1 голос
/ 05 мая 2020

Не работает, потому что pandas в skiprows опускает строки по позициям:

data = "i,a,b\ngood,1,2\nbad,3,a\nbad,a,b\ngood,1,2\nbad,3,a"

df = pd.read_csv(StringIO(data))
print (df)
      i  a  b
0  good  1  2
1   bad  3  a
2   bad  a  b
3  good  1  2
4   bad  3  a

df = pd.read_csv(StringIO(data),skiprows=lambda index: 2 == index)
print (df)
      i  a  b
0  good  1  2
1   bad  a  b
2  good  1  2
3   bad  3  a

df = pd.read_csv(StringIO(data),index_col='i', skiprows=lambda index: 2 == index)
print (df)
      a  b
i         
good  1  2
bad   a  b
good  1  2
bad   3  a

Что короче:

df = pd.read_csv(StringIO(data),skiprows=[2])
print (df)
      i  a  b
0  good  1  2
1   bad  a  b
2  good  1  2
3   bad  3  a

Но если хотите удалить индекс по имени:

df = pd.read_csv(StringIO(data),index_col='i', skiprows=['bad'])
print (df)

TypeError: требуется целое число

Не работает, нет ошибки повышения:

df = pd.read_csv(StringIO(data),index_col='i', skiprows=lambda index: 'bad' == index)
print (df)
      a  b
i         
good  1  2
bad   3  a
bad   a  b
good  1  2
bad   3  a


df = pd.read_csv(StringIO(data), skiprows=lambda index: 'bad' == index)
print (df)

      i  a  b
0  good  1  2
1   bad  3  a
2   bad  a  b
3  good  1  2
4   bad  3  a

Проверка образца решение из pandas документации :

df = pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)
print (df)
      i  a  b
0   bad  3  a
1  good  1  2

df = pd.read_csv(StringIO(data), index_col='i',skiprows=lambda x: x % 2 != 0)
print (df)
      a  b
i         
bad   3  a
good  1  2

РЕДАКТИРОВАТЬ: возможное решение с данными предварительной обработки для позиций для пропуска:

df = pd.read_csv('a.csv')
print (df)
      i  a  b
0  good  1  2
1   bad  3  a
2   bad  a  b
3  good  1  2
4   bad  3  a

#preprocessing
def get_row(data):
    out = []
    with open('a.csv', 'r') as csvfile:
        reader = csv.reader(csvfile)
        for i, row in enumerate(reader):
            if row[0] == data:
                out.append(i)
    return out


skip = get_row('bad')            
print(skip)
[2, 3, 5]

df = pd.read_csv('a.csv', skiprows=get_row('bad') )
print (df)
      i  a  b
0  good  1  2
1  good  1  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...