我正在使用pandas,我有一个有数字的列但是当我检查数据类型时,我得到的列是一个对象。我认为该列中的一行实际上是一个字符串。我怎样才能找出哪一行是字符串?例如:
Name A B
John 0 1
Rich 1 0
Jim O 1
Jim在列A上有字母“O”而不是零。如果我有数千行,我可以在pandas中使用哪些行来查找字符串而不是数字?在这个例子中,我使用字母O,但它可以是任何字母,真的。
答案 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所知的任何类型 - int
,str
,list
set
个namedtuple
类型的自定义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-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的数字。
答案 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}