Python 找出哪一行有字符串
我使用的是pandas,我有一个列有数字,但当我检查数据类型时,我得到的列是一个对象。我认为该列中的一行实际上是一个字符串。我怎样才能找出哪一行是字符串?例如:Python 找出哪一行有字符串,python,pandas,Python,Pandas,我使用的是pandas,我有一个列有数字,但当我检查数据类型时,我得到的列是一个对象。我认为该列中的一行实际上是一个字符串。我怎样才能找出哪一行是字符串?例如: Name A B John 0 1 Rich 1 0 Jim O 1 Jim在A列上有字母“O”而不是零。如果我有数千行,我可以在pandas中使用什么来查找哪一行有字符串而不是数字?在这个例子中,我使用了字母O,但它可以是任何字母,真的 您可以使用pandas.to_numeric查
Name A B
John 0 1
Rich 1 0
Jim O 1
Jim在A列上有字母“O”而不是零。如果我有数千行,我可以在pandas中使用什么来查找哪一行有字符串而不是数字?在这个例子中,我使用了字母O,但它可以是任何字母,真的 您可以使用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
如果您不确定哪个列有问题,可以这样做(假设您要检查除第一个名称列以外的所有内容):
dtype
对象
意味着该列包含通用的Python类型值
这些值可以是Python知道的任何类型,一个int
、一个str
、一个set
s的list
或您创建的一些自定义namedtuple
类型,等等
您可以对这些对象调用普通的Python函数或方法(例如,通过直接访问它们,或通过Pandas的apply
),方法与对任何其他Python变量的方法相同
其中包括类型
功能、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
df=pd.DataFrame({'A':[0,1,O'],'B':[1,0,1]})
>>>df.A
0 0
1 1
二○
名称:A,数据类型:对象
>>>df.A.apply(类型)
0
1.
2.
名称:A,数据类型:对象
>>>df.A.apply(λx:isinstance(x,str))
0错误
1错误
2正确
姓名:A,数据类型:bool
>>>df.A.apply(报告)
0 0
1 1
二点钟
名称:A,数据类型:对象
…等等。我想添加另一个非常简短的解决方案,它是ALollz和abarnert的组合 首先,让我们查找具有
cols=(df.dtypes=='object').nonzero()[0]
的object类型的所有列。让我们使用iloc
过滤掉这些数据,并将pd.应用于_numeric
(并且让我们也不要使用col变量的一个片段包括name列[1://code>)。然后检查na值,如果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
[02]#
这将为您提供一个{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}
对象
意味着它持有通用的Python类型的值,可以是Python知道的任何类型的值,int
,str
,列表
的集合
的一些自定义的名称双倍
类型,不管是什么。您可以像处理任何其他Python变量一样,对这些对象调用方法(例如,通过Pandas的apply
)
types = list(df['A'].apply(lambda x: type(x))
names = list(df['Name'])
d = dict(zip(names, types))
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}