我的 pandas DataFrame 选择没有错误吗?

Is my pandas DataFrame selection bug-free?

我有一个非常大的星系群目录,另一个具有来自 Zoo Universe 项目的形态。我做了一个外部连接,所以我现在有一个带有列 'Morph' 的 DataFrame,其中可以有 NaN(来自外部连接)、'U'(未知的 Galaxy 动物园代码)或适当的值。

现在我正在寻找所有形态已知的组(即具有相同 'Group' 值的行)。不幸的是,当我 运行 我的代码时,它找到了 none,这对我来说非常难过,但是有可能(我无法在 15 分钟的数据检查中找到一个例子,但是这考虑到目录的大小,这不是证明)。

问题是:我的代码没有错误吗?

这是一个模拟示例:

df= pd.DataFrame(data=[[1,'S'],[1,'E'],[1,'E'],[2,'U'],[2,'E'],[2,'S'],[3,np.nan],
                       [3,'E'],[3,'E'],[4,'U'],[4,'U'],[4,'U']], columns=['Group','Morph'])

df

还有我的代码:

df.groupby('Group').filter(lambda x: (~x.Morph.isin(['U',np.nan]).any() ))

这似乎在这里工作:

第一组是唯一没有 NaN 和 'U' 的组。有没有可能它在这里工作是偶然的,我的代码中有一个错误不会在我的简单示例中显示出来?

我认为你的解决方案很好,我添加了没有 groupby 的替代解决方案,双 booelan indexingisin:

print (df[df['Morph'].isin(['U',np.nan])])
    Group Morph
3       2     U
6       3   NaN
9       4     U
10      4     U
11      4     U

#unique is for faster isin if check unique values
idx = df.loc[df['Morph'].isin(['U',np.nan]), 'Group'].unique()
print (idx)
[2 3 4]

print (df[~df['Group'].isin(idx)])
   Group Morph
0      1     S
1      1     E
2      1     E

一行解法:

print (df[~df['Group'].isin(df.loc[df['Morph'].isin(['U',np.nan]), 'Group'].unique())])
   Group Morph
0      1     S
1      1     E
2      1     E

比较解决方案 - 存在很大差异 - groupby 解决方案慢 100 倍,但主要取决于您的真实数据:

np.random.seed(123)
#1M df
N = 1000000
L2 = ['S','E','U',np.nan]
df = pd.DataFrame({'Group':np.random.randint(100000, size=N), 
                   'Morph': np.random.choice(L2, N)})

#print (df)

In [46]: %timeit (df[~df['Group'].isin(df.loc[df['Morph'].isin(['U',np.nan]), 'Group'].unique())])
1 loop, best of 3: 372 ms per loop

In [47]: %timeit (df.groupby('Group').filter(lambda x: (~x.Morph.isin(['U',np.nan]).any() )))
1 loop, best of 3: 34.7 s per loop