Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 找出哪一行有字符串_Python_Pandas - Fatal编程技术网

Python 找出哪一行有字符串

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查

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

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}