найти, в какой строке есть строка - PullRequest
0 голосов
/ 26 мая 2018

Я использую панд, и у меня есть столбец, в котором есть номера, но когда я проверяю тип данных, я получаю, что столбец является объектом.Я думаю, что одна из строк в этом столбце на самом деле является строкой.Как я могу узнать, какая строка является строкой?Например:

Name    A    B
John    0    1
Rich    1    0
Jim     O    1

Джим имеет букву «О» вместо ноля в столбце А. Что я могу использовать в пандах, чтобы найти, в какой строке есть строка вместо номера, если у меня тысячи строк?В этом примере я использовал букву O, но на самом деле это могла быть любая буква.

Ответы [ 4 ]

0 голосов
/ 26 мая 2018
types = list(df['A'].apply(lambda x: type(x))
names = list(df['Name'])
d = dict(zip(names, types))

Это даст вам словарь {name:type}, чтобы вы знали, какое имя имеет строковое значение в столбце А. В качестве альтернативы, если вы просто хотите найти строку, в которой находится строка, используйте это:

types = list(df['A'].apply(lambda x: type(x))
rows = df.index.tolist()
d = dict(zip(rows, types))
# to get only the rows that have string values in column A
d = {k:v in d.items() if v == str}
0 голосов
/ 26 мая 2018

dtype object означает, что столбец содержит общие значения, типизированные Python.

Эти значения могут быть любого типа, который знает Python - int, str, list из set s какого-то пользовательского namedtuple типа, который вы создали, что угодно.

И вы можете просто вызывать обычные функции или методы Python для этих объектов (например, путем прямого доступа к ним или через Pandas 'apply) так же, как и с любыми другими переменными Python.

И это включает в себя функцию type, функцию isinstance и т. Д.: * 10101 *

>>> df = pd.DataFrame({'A': [0, 1, 'O'], 'B': [1, 0, 1]})
>>> df.A
0    0
1    1
2    O
Name: A, dtype: object
>>> df.A.apply(type)
0    <class 'int'>
1    <class 'int'>
2    <class 'str'>
Name: A, dtype: object
>>> df.A.apply(lambda x: isinstance(x, str))
0    False
1    False
2     True
Name: A, dtype: bool
>>>  df.A.apply(repr)
0      0
1      1
2    'O'
Name: A, dtype: object

… и т. Д.

0 голосов
/ 26 мая 2018

Я хотел бы добавить еще одно очень короткое и краткое решение, которое будет представлять собой комбинацию ALollz и abarnert.

Сначала давайте найдем все столбцы, имеющие тип объекта с cols = (df.dtypes == 'object').nonzero()[0].Давайте отфильтруем их с помощью iloc и применим pd.to_numeric (и давайте также не будем включать столбец имени, используя фрагмент переменной col [1:]).Затем мы проверяем na-values и, если any(1) (по строкам), мы возвращаем индекс этой строки.

Полный пример:

import pandas as pd

data = '''\
Name    A    B   C
John    0    1   O
Rich    1    0   2
Jim     O    1   O'''

df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')

cols = (df.dtypes == 'object').nonzero()[0]
rows = df.iloc[:,cols[1:]].apply(pd.to_numeric, errors='coerce').isna().any(1).nonzero()[0]
print(rows)

Возвращает:

[0 2]  # <-- Means that row 0 and 2 contain N/A-values in at least 1 column

Это отвечает на ваш вопрос: what can I use in pandas to find which row has the string instead of the number, но для всех столбцов, которые ищут строки, предполагая, что они не могут быть преобразованы в числа с помощью pd.to_numeric.

0 голосов
/ 26 мая 2018

Вы можете использовать pandas.to_numeric, чтобы увидеть, что не конвертируется в число.Затем с помощью .isnull() вы можете установить исходные значения df, чтобы точно определить, какие строки являются проблемными.

import pandas as pd
df[pd.to_numeric(df.A, errors='coerce').isnull()]
#  Name  A  B
#2  Jim  O  1

Если вы не уверены, какой столбец является проблемным, вы можете сделать что-то вроде (при условииВы хотите проверить все, кроме 1-го столбца имени):

df2 = pd.DataFrame()
for col in df.columns[1::]:
    df2[col] = pd.to_numeric(df[col], errors='coerce')

df[df2.isnull().sum(axis=1).astype(bool)]
#  Name  A  B
#2  Jim  O  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...