熊猫:使用数据类型过滤数据帧



我有数据帧。这是一部分

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')

最新更新