我有一个约一百万行的大型数据框。它们通过“关键字”列与附加的“ X”和“ Y”列进行分组。

X   Keyword      Y
yy   apply      yy
xx   apply      yy
xy   apply      yx
xx   terms      ix
yy   terms      xi


我想对这些关键字执行某些功能,但情况有些尴尬。基本上,对于每组关键字,我想执行以下操作:

如果大小大于一行:


删除列“ x”等于列“ y”的行
保留其余的行


但是,对于只有一行的组,其中唯一的行是'x'=='y',则忽略它。

我目前所拥有的是:

df = df.merge(another_df, on='Keyword', how="inner")
df = df.groupby('Keyword').apply(group_filter)

def group_filter(group):

    if len(group) > 1:

        group = group.query('x != y')

    return group


这个过程有点慢,我想知道是否有更快的方法可以做到这一点?

最佳答案

是的,apply不太快。但是,IIUC可以将操作向量化:

group_size = df.groupby("Keyword")["Keyword"].transform("count")
x_eq_y = df["X"] == df["Y"]
df_out = df.loc[(group_size == 1) | (~x_eq_y)]


这给了我

In [76]: df
Out[76]:
    X Keyword   Y
0  yy   apply  yy
1  xx   apply  yy
2  xy   apply  yx
3  xx   terms  ix
4  yy   terms  xi
5  ab  unique  ab

In [77]: group_size = df.groupby("Keyword")["Keyword"].transform("count")

In [78]: x_eq_y = df["X"] == df["Y"]

In [79]: df.loc[(group_size == 1) | (~x_eq_y)]
Out[79]:
    X Keyword   Y
1  xx   apply  yy
2  xy   apply  yx
3  xx   terms  ix
4  yy   terms  xi
5  ab  unique  ab

关于python - 加快 Pandas 速度适用于一批团体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43847431/

10-15 20:54