在我的数据集中,有几行包含字符。我只需要包含所有整数的行。最好的方法是什么?以下是数据集: 例如,我想删除第2行和第3行,因为它们分别包含051A、04A和08B。
1 2017 0 321 3 20 42 18
2 051A 0 321 3 5 69 04A
3 460 0 1633 16 38 17 08B
4 1811 0 822 8 13 65 18
在我的数据集中,有几行包含字符。我只需要包含所有整数的行。最好的方法是什么?以下是数据集: 例如,我想删除第2行和第3行,因为它们分别包含051A、04A和08B。
1 2017 0 321 3 20 42 18
2 051A 0 321 3 5 69 04A
3 460 0 1633 16 38 17 08B
4 1811 0 822 8 13 65 18
df.apply(lambda x: pd.to_numeric(x, errors = 'coerce')).dropna()
0 1 2 3 4 5 6 7
0 1 2017.0 0 321 3 20 42 18.0
3 4 1811.0 0 822 8 13 65 18.0
apply
,尽管我不如 pd.to_numeric(df.stack(), 'coerce').unstack().dropna()
好用。(-: 话虽如此,这并没有解决浮点数的问题。原帖中说所有行都是整数。如果一行中出现了浮点数,这个方法就无法将其删除。 - piRSquareddf[df.applymap(lambda x: str(x).isdecimal()).all(1)].astype(int)
0 1 2 3 4 5 6 7
0 1 2017 0 321 3 20 42 18
3 4 1811 0 822 8 13 65 18
isdecimal
而不是 isdigit
。针对此任务,如所述,try / except
是一种处理所有情况的解决方案。
pd.DataFrame.applymap
将函数应用于数据框中的每个元素。
def CheckInt(s):
try:
int(s)
return True
except ValueError:
return False
res = df[df.applymap(CheckInt).all(axis=1)].astype(int)
# 0 1 2 3 4 5 6 7
# 0 1 2017 0 321 3 20 42 18
# 3 4 1811 0 822 8 13 65 18
df[df.applymap(lambda x: str(x).isdigit()).all(1)].astype(int)
- piRSquared'1.1'.isdigit()
对我来说解析为 False
。另外,当我说我喜欢“这个”答案时,我的意思是你的 (-: - piRSquaredstack
+ unstack
范式来避免循环的解决方案。v = df.stack().astype(str)
v.where(v.str.isdecimal()).unstack().dropna().astype(int)
0 1 2 3 4 5 6 7
0 1 2017 0 321 3 20 42 18
3 4 1811 0 822 8 13 65 18
简单来说,我认为您可以使用pandas中的convert_objects
函数。使用该函数,我们将对象转换为整数,这将导致NA值。最后,我们删除NA值。
df = df.convert_objects(convert_numeric=True).dropna()