我想检查数据框中的列是否由字符串组成,因此我可以用数字标记它们以用于机器学习目的。有些列由数字组成,我不想更改它们。列示例如下所示:
TRAIN FEATURES
Age Level
32.0 Silver
61.0 Silver
66.0 Silver
36.0 Gold
20.0 Silver
29.0 Silver
46.0 Silver
27.0 Silver
谢谢=)
答案 0 :(得分:8)
是的,它可能。您使用dtype
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': ['a','b','c','d']})
if df['a'].dtype != np.number:
print('yes')
else:
print('no')
您还可以使用select_dtypes
df_subset = df.select_dtypes(exclude=[np.number])
# Now apply you can label encode your df_subset
答案 1 :(得分:3)
请注意,以上答案将包括DateTime,TimeStamp,Category 和其他数据类型。
使用object
更具限制性(虽然我不确定其他dtypes
是否还会object
dtype):
创建数据框:
df = pd.DataFrame({
'a': ['a','b','c','d'],
'b': [1, 'b', 'c', 2],
'c': [np.nan, 2, 3, 4],
'd': ['A', 'B', 'B', 'A'],
'e': pd.to_datetime('today')})
df['d'] = df['d'].astype('category')
这将是这样的:
a b c d e
0 a 1 NaN A 2018-05-17
1 b b 2.0 B 2018-05-17
2 c c 3.0 B 2018-05-17
3 d 2 4.0 A 2018-05-17
您可以查看调用dtypes
的类型:
df.dtypes
a object
b object
c float64
d category
e datetime64[ns]
dtype: object
您可以使用items()
方法列出字符串列,并按object
进行过滤:
> [ col for col, dt in df.dtypes.items() if dt == object]
['a', 'b']
或者您可以使用select_dtypes显示仅包含字符串的数据框:
df.select_dtypes(include=[object])
a b
0 a 1
1 b b
2 c c
3 d 2
答案 2 :(得分:2)
这个问题提出 4 年了,我相信仍然没有明确的答案。
我不认为字符串在 Pandas 中被视为一等公民(甚至 >= 1.0.0)。举个例子:
import pandas as pd
import datetime
df = pd.DataFrame({
'str': ['a', 'b', 'c', None],
'hete': [1, 2.0, datetime.datetime.utcnow(), None]
})
string_series = df['str']
print(string_series.dtype)
print(pd.api.types.is_string_dtype(string_series.dtype))
heterogenous_series = df['hete']
print(heterogenous_series.dtype)
print(pd.api.types.is_string_dtype(heterogenous_series.dtype))
印刷品
object
True
object
True
所以虽然 hete
不包含任何明确的字符串,但它被认为是一个字符串系列。
阅读the documentation后,我认为确保一个系列只包含字符串的唯一方法是:
def is_string_series(s : pd.Series):
if isinstance(s.dtype, pd.StringDtype):
# The series was explicitly created as a string series (Pandas>=1.0.0)
return True
elif s.dtype == 'object':
# Object series, check each value
return all((v is None) or isinstance(v, str) for v in s)
else:
return False
答案 3 :(得分:1)
扩大Scratch'N'Purr的答案:
>>> df = pd.DataFrame({'a': ['a','b','c','d'], 'b': [1, 'b', 'c', 2], 'c': [np.nan, 2, 3, 4]})
>>> df
a b c
0 a 1 NaN
1 b b 2.0
2 c c 3.0
3 d 2 4.0
>>> dict(filter(lambda x: x[1] != np.number, list(zip(df.columns, df.dtypes))))
{'a': dtype('O'), 'b': dtype('O')}
所以我添加了一些混合类型的列。您可以看到filter
+ dict
方法产生关键:值映射,其中列的dtypes超出np.number
的范围。这应该在规模上很好地运作。您还可以尝试将每列强制转换为特定类型(例如int
),然后在无法将字符串列转换为ValueError
时捕获int
异常。有很多方法可以做到这一点。
答案 4 :(得分:0)
我使用两步方法:首先确定是否为dtype==object
,然后确定是否为第一行数据,以查看该列的数据是否为字符串。
c = 'my_column_name'
if df[c].dtype == object and isinstance(df.iloc[0][c], str):
# do something
答案 5 :(得分:0)
据我所知,知道有哪些类型的唯一可靠方法是检查值,然后您可以进行断言以查看它是否符合您的预期。
下面的函数将获取列中每个值的 dtypes,删除重复项,然后转换为列表,以便您可以查看/与之交互。这将让您以您希望的方式处理混合类型、对象和 NA(当然 np.nan 是 float 类型,但我将这些事情留给感兴趣的读者)
import pandas as pd
df = pd.DataFrame({"col1": [1, 2, 3, 4],
"col2": ["a", "b", "c", "d"],
"col3": [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
})
print(df.dtypes.to_dict())
# {'col1': dtype('int64'), 'col2': dtype('O'), 'col3': dtype('O')}
def true_dtype(df): # You could add a column filter here too
return {col: df[col].apply(lambda x: type(x)).unique().tolist() for col in df.columns}
true_types = true_dtype(df)
print(true_types)
# {'col1': [<class 'int'>], 'col2': [<class 'str'>], 'col3': [<class 'list'>]}
print(true_types['col2'] == [str])
# True