我有数据帧。这是一部分
member_id event_duration domain category
0 299819 17 element.yandex.ru None
1 299819 0 mozilla.org Программы
2 299819 4 vbmail.ru None
3 299819 aaa vbmail.ru None
如何用类型过滤 df? 通常我用str.contains
来做,也许指定任何类似的东西是正常的df[df.event_duration.astype(int) == True]
?
如果所有其他行值都有效,因为它们没有NaN
,那么您可以使用to_numeric
将列转换为数字,这会将字符串转换为NaN
,然后您可以使用notnull
过滤掉这些:
In [47]:
df[pd.to_numeric(df['event_duration'], errors='coerce').notnull()]
Out[47]:
member_id event_duration domain category
0 299819 17 element.yandex.ru None
1 299819 0 mozilla.org Программы
2 299819 4 vbmail.ru None
这:
df[df.event_duration.astype(int) == True]
不起作用,因为字符串将引发ValueError
异常,因为字符串无法转换
您可以使用df.select_dtypes()。
df.select_dtypes("int")
上面的一些答案似乎过于复杂。 在大多数情况下,这应该适用于列中存在混合数据类型的情况:
df[df['event_duration'].apply(lambda x: isinstance(x, str))]
您也可以使用正则表达式。
df[df["event_duration"].str.contains(r"^d+$")]
Best_soultion:
df["event_duration"].transform(lambda x: x.fillna('') if x.dtype == 'float64' else x.float64(0))
df["event_duration"].transform(lambda x: x.replace('orange','5') if x.dtype == 'object' else x.fillna(0))
您可以在中间列中找到所有不同的 str 集。
s= set([x for x in df["event_duration"] if type(x).__name__ == "str"])
s
例如输出:
apple
mango
然后你可以像
df[df["event_duration"]!='apple']
#or
df[df["event_duration"].isin(s)==False] #or True for reverse
或 强制错误,你可以做这样的事情
df["event_duration"] = pd.to_numeric(df["event_duration"], errors='coerce')