Pandas:按数据类型过滤数据框。

13

我有一个数据框。它是其中的一部分。

        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

如何根据类型过滤数据框? 通常我会使用 str.contains,也许可以像这样指定任何类型: df[df.event_duration.astype(int) == True]

5个回答

10

如果所有的其他行值都是有效的,也就是说它们不是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[(pd.to_numeric(df['event_duration'], errors='coerce').notnull() | pd.to_numeric(df['member_id'], errors='coerce').notnull())] 将返回一个数据框,其中包含所有行,其中 event_durationmember_id 不是数字。 - Greg Kaleka

10

4
这将返回列的子集,而不是行的子集。 - Greg Kaleka

3

以上一些答案似乎过于复杂。在大多数情况下,当列中存在混合数据类型时,以下方法应该有效:

df[df['event_duration'].apply(lambda x: isinstance(x, str))]

1
最佳解决方案:
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))

在整数列中,您可以找到各种不同的字符串集。

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

1
你也可以使用正则表达式。
df[df["event_duration"].str.contains(r"^\d+$")]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接