我有一个DataFrame df
,其列type
和subtype
以及大约100k行,我试图对df
包含的数据类型进行分类检查type
/ subtype
组合。虽然df
可以包含许多不同的组合,但只有特定的组合才会出现在某些数据类型中。要检查我的对象是否包含我目前正在执行的任何组合:
typeA = ((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) |
(df.subtype == 5) | (df.subtype == 6))) |
((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) |
(df.subtype == 8)))
A = typeA.sum()
如果A类型是长期的Falses系列,那么可能有一些真则。 0然后我知道它包含一个True。这个方案的问题是,如果df的第一行产生一个True,它仍然需要检查其他所有内容。检查整个DataFrame比使用带有中断的for循环更快,但我想知道是否有更好的方法。
感谢您的任何建议。
答案 0 :(得分:6)
使用crosstab
:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 10, size=(100, 2)), columns=["type", "subtype"])
counts = pd.crosstab(df.type, df.subtype)
print counts.loc[0, [2, 3, 5, 6]].sum() + counts.loc[5, [3, 4, 7, 8]].sum()
结果与:
相同a = (((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) |
(df.subtype == 5) | (df.subtype == 6))) |
((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) |
(df.subtype == 8))))
a.sum()
答案 1 :(得分:1)
在pandas 0.13(即将发布)中,您可以将其作为query传递,它将使用numexpr,这对您的用例应该更有效:
df.query("((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) |
(df.subtype == 5) | (df.subtype == 6))) |
((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) |
(df.subtype == 8)))")
注意:我可能会清理缩进以使其更具可读性(在大多数情况下,您也可以用类型替换df.type:
df.query("((type == 0) & ((subtype == 2)"
"|(subtype == 3)"
"|(subtype == 5)"
"|(subtype == 6)))"
"|((type == 5) & ((subtype == 3)"
"|(subtype == 4)"
"|(subtype == 7)"
"|(subtype == 8)))")
更新:使用“in”语法可能更有效,更简洁,更简洁:
df.query("(type == 0) & (subtype in [2, 3, 5, 6])"
"|(type == 5) & (subtype in [3, 4, 7, 8])")