我的 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 indexing
和 isin
:
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
我有一个非常大的星系群目录,另一个具有来自 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 indexing
和 isin
:
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