所以有一个DataFrame说:
>>> df = pd.DataFrame({
... 'A':[1,2,'Three',4],
... 'B':[1,'Two',3,4]})
>>> df
A B
0 1 1
1 2 Two
2 Three 3
3 4 4
Run Code Online (Sandbox Code Playgroud)
我想选择特定列的特定行的数据类型是类型的行str
.
比如我要选择的行,其中type
在列中的数据A
是str
.所以它应该打印如下:
A B
2 Three 3
Run Code Online (Sandbox Code Playgroud)
谁的直观代码是这样的:
df[type(df.A) == str]
Run Code Online (Sandbox Code Playgroud)
这显然不起作用!
谢谢请帮忙!
DrT*_*TRD 18
这有效:
df[df['A'].apply(lambda x: type(x)==str)]
Run Code Online (Sandbox Code Playgroud)
您可以执行与要求类似的操作
In [14]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[14]:
A B
2 Three 3
Run Code Online (Sandbox Code Playgroud)
为什么只相似?因为Pandas将事物存储在同类列中(列中的所有条目都是同一类型)。即使您是从异构类型构造DataFrame的,它们也都被制成具有最低公分母的各列:
In [16]: df.A.dtype
Out[16]: dtype('O')
Run Code Online (Sandbox Code Playgroud)
因此,您无法询问哪些行属于哪种类型-它们都属于同一类型。您可以做的是尝试将条目转换为数字,并检查转换失败的地方(这是上面的代码的作用)。
使用系列来保存混合数字和非数字类型通常是一个坏主意。这将导致您的系列具有 dtype object
,它只不过是一个指针序列。非常相似list
,事实上,此类系列上的许多操作都可以使用 更有效地处理list
。
通过此免责声明,您可以通过列表理解使用布尔索引:
res = df[[isinstance(value, str) for value in df['A']]]
print(res)
A B
2 Three 3
Run Code Online (Sandbox Code Playgroud)
等效的情况也可以使用pd.Series.apply
,但这只不过是一个薄薄的循环,并且可能比列表理解慢:
res = df[df['A'].apply(lambda x: isinstance(x, str))]
Run Code Online (Sandbox Code Playgroud)
如果您确定所有非数字值必须是字符串,那么您可以转换为数字并查找空值,即无法转换的值:
res = df[pd.to_numeric(df['A'], errors='coerce').isnull()]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10309 次 |
最近记录: |