找到哪一行有一个字符串

时间:2018-05-25 21:56:03

标签: python pandas

我正在使用pandas,我有一个有数字的列但是当我检查数据类型时,我得到的列是一个对象。我认为该列中的一行实际上是一个字符串。我怎样才能找出哪一行是字符串?例如:

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

Jim在列A上有字母“O”而不是零。如果我有数千行,我可以在pandas中使用哪些行来查找字符串而不是数字?在这个例子中,我使用字母O,但它可以是任何字母,真的。

4 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

dtype object表示该列包含通用的Python类型值。

这些值可以是Python所知的任何类型 - intstrlist setnamedtuple类型的自定义apply类型创造,无论如何。

您可以像对待任何其他Python变量一样,在这些对象上调用普通的Python函数或方法(例如,通过直接访问它们,或通过Pandas' type)。

这包括isinstance函数,>>> 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 函数等:

-- Create Dynamic Query
DECLARE @ValidateAccountCommand VARCHAR(MAX) 
SELECT @ValidateAccountCommand = COALESCE(@ValidateAccountCommand + 
                                            '; EXEC A ', 
                                             'EXEC A ') 
                                + CONVERT(NVARCHAR,XxxData.X)
FROM 
(SELECT X FROM XXX) XxxData

PRINT @ValidateAccountCommand
EXECUTE (@ValidateAccountCommand)

......等等。

答案 2 :(得分:0)

我想添加另一个非常简短的解决方案,该解决方案将是ALollz和abarnert的组合。

首先,让我们找到cols = (df.dtypes == 'object').nonzero()[0]类型为object的列。让我们使用iloc过滤掉这些内容并应用pd.to_numeric(我们也不要使用col变量[1:]的切片来包含名称列)。然后我们检查na-valuesany(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的数字。

答案 3 :(得分:0)

types = list(df['A'].apply(lambda x: type(x))
names = list(df['Name'])
d = dict(zip(names, types))

这将为您提供{name:type}的字典,以便您知道哪个名称在A列中具有字符串值。或者,如果您只想查找字符串所在的行,请使用:

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}