我对检查Pandas数据帧列中的项目的最佳方法有些困惑。
我正在编写一个程序,如果数据帧在某个列中有不允许的元素,就会引发错误。
以下是一个示例:
import pandas as pd
raw_data = {'first_name': ['Jay', 'Jason', 'Tina', 'Jake', 'Amy'],
'last_name': ['Jones', 'Miller', 'Ali', 'Milner', 'Cooze'],
'age': [47, 42, 36, 24, 73],
'preTestScore': [4, 4, 31, 2, 3],
'postTestScore': [27, 25, 57, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'preTestScore', 'postTestScore'])
print(df)
输出结果
first_name last_name age preTestScore postTestScore
0 Jay Jones 47 4 27
1 Jason Miller 42 4 25
2 Tina Ali 36 31 57
3 Jake Milner 24 2 62
4 Amy Cooze 73 3 70
如果列
last_name
中除了Jones
、Miller
、Ali
、Milner
或Cooze
之外还包含其他内容,则发出警告。
可能可以使用pandas.DataFrame.isin
,但我不确定这是否是最有效的方法。
类似以下代码:if df.isin('last_name':{'Jones', 'Miller', 'Ali', 'Milner', 'Cooze'}).any() == False:
raise:
ValueError("Column `last_name` includes ill-formed elements.")
set(L).issubset(df['last_name'])
明显是最高效的。 - EB2127if not set(L).issubset(df['last_name'])
存在一些意外的副作用。原始条件是“如果列 last_name 包含除 Jones、Miller、Ali、Milner 或 Cooze 之外的任何内容,则发出警告。”例如,如果原始数据框仅包含 Jones 和 Miller(均有效),但不包含Cooze
(有效),则会引发错误。 - EB2127last_name
只包含元素Miller
,那应该没问题。但上述的.issubset()
会抛出一个错误,因为必须包括 'Jones'、'Miller'、'Ali'、'Milner' 和 'Cooze'。 - EB2127