Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有比groupby更快的方法来遍历组?_Python_Pandas - Fatal编程技术网

Python 有没有比groupby更快的方法来遍历组?

Python 有没有比groupby更快的方法来遍历组?,python,pandas,Python,Pandas,所以我把前面的一个问题缩小到了这一点:我有一个看起来像这样的数据帧 id temp1 temp2 9 10.0 True False 10 10.0 True False 11 10.0 False True 12 10.0 False True 17 15.0 True False 18 15.0 True False

所以我把前面的一个问题缩小到了这一点:我有一个看起来像这样的数据帧

              id  temp1  temp2
    9       10.0   True  False
    10      10.0   True  False
    11      10.0  False   True
    12      10.0  False   True
    17      15.0   True  False
    18      15.0   True  False
    19      15.0   True  False
    20      15.0   True  False
    21      15.0  False  False
    33      27.0   True  False
    34      27.0   True  False
    35      27.0  False   True
    36      27.0  False  False
    40      31.0   True  False
    41      31.0  False   True 
               .
               .
               .
事实上,它有几百万行长,还有其他几列

我现在让它做的是

    grouped = coinc.groupby('id')
    final = grouped.filter(lambda x: ( x['temp2'].any() and x['temp1'].any()))
    lanif = final.drop(['temp1','temp2'],axis = 1 )
coinc是数据帧的名称

它仅在temp1和temp2中对某些id相同的行都为true时,才按id对行进行分组。例如,对于上面的数据帧,它将删除id为15的行,但保留所有其他行

然而,这是非常缓慢的,我想知道是否有更快的方法来做到这一点。

在这里使用带有lambda函数的过滤器会使您的速度大大降低。你可以通过移除它来加快速度

在更大的框架上将其与您的方法进行比较

a = np.random.randint(1, 1000, 100_000)
b = np.random.randint(0, 2, 100_000, dtype=bool)
c = ~b

coinc = pd.DataFrame({'id': a, 'temp1': b, 'temp2': c})

In [295]: %%timeit
     ...: u = coinc.groupby('id')
     ...: m = u.temp1.any() & u.temp2.any()
     ...: res = coinc.loc[coinc.id.isin(m[m].index), ['id']]
     ...:
13.5 ms ± 476 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [296]: %%timeit
     ...: grouped = coinc.groupby('id')
     ...: final = grouped.filter(lambda x: ( x['temp2'].any() and x['temp1'].any()))
     ...: lanif = final.drop(['temp1','temp2'],axis = 1 )
     ...:
527 ms ± 7.91 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在这里使用带有lambda函数的过滤器会大大降低速度。你可以通过移除它来加快速度

在更大的框架上将其与您的方法进行比较

a = np.random.randint(1, 1000, 100_000)
b = np.random.randint(0, 2, 100_000, dtype=bool)
c = ~b

coinc = pd.DataFrame({'id': a, 'temp1': b, 'temp2': c})

In [295]: %%timeit
     ...: u = coinc.groupby('id')
     ...: m = u.temp1.any() & u.temp2.any()
     ...: res = coinc.loc[coinc.id.isin(m[m].index), ['id']]
     ...:
13.5 ms ± 476 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [296]: %%timeit
     ...: grouped = coinc.groupby('id')
     ...: final = grouped.filter(lambda x: ( x['temp2'].any() and x['temp1'].any()))
     ...: lanif = final.drop(['temp1','temp2'],axis = 1 )
     ...:
527 ms ± 7.91 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

问题不在于groupby,而在于lambda。Lambda操作未矢量化*。使用agg可以更快地获得相同的结果。我会:

 groupdf = coinc.groupby('id').agg(any)
 # Selects instance where both contain at least one true statement
 mask = maskdf[['temp1','temp2']].all(axis=1) 
 lanif = groupdf[mask].drop(['temp1','temp2'],axis = 1 )

*对不起,这是一个非常微妙的问题,我认为它过于简单化了。

问题不在于groupby,而在于lambda。Lambda操作未矢量化*。使用agg可以更快地获得相同的结果。我会:

 groupdf = coinc.groupby('id').agg(any)
 # Selects instance where both contain at least one true statement
 mask = maskdf[['temp1','temp2']].all(axis=1) 
 lanif = groupdf[mask].drop(['temp1','temp2'],axis = 1 )
i, u = pd.factorize(coinc.id)
t = np.zeros((len(u), 2), bool)
c = np.column_stack([coinc.temp1.to_numpy(), coinc.temp2.to_numpy()])

np.logical_or.at(t, i, c)

final = coinc.loc[t.all(1)[i], ['id']]

final

      id
9   10.0
10  10.0
11  10.0
12  10.0
33  27.0
34  27.0
35  27.0
36  27.0
40  31.0
41  31.0

*这是一个非常微妙的问题,我认为它过于简单化了,对不起。

这里是另一个替代解决方案

i, u = pd.factorize(coinc.id)
t = np.zeros((len(u), 2), bool)
c = np.column_stack([coinc.temp1.to_numpy(), coinc.temp2.to_numpy()])

np.logical_or.at(t, i, c)

final = coinc.loc[t.all(1)[i], ['id']]

final

      id
9   10.0
10  10.0
11  10.0
12  10.0
33  27.0
34  27.0
35  27.0
36  27.0
40  31.0
41  31.0
f = coinc.groupby('id').transform('any')
result = coinc.loc[f['temp1'] & f['temp2'], coinc.columns.drop(['temp1', 'temp2'])]

这是另一个替代方案

f = coinc.groupby('id').transform('any')
result = coinc.loc[f['temp1'] & f['temp2'], coinc.columns.drop(['temp1', 'temp2'])]

免责声明:我没有测试这段代码,因为我没有一种简单的方法来输入样本数据。免责声明:我没有测试这段代码,因为我没有一种简单的方法来输入样本数据。问题:我做的有点不同。使用您的代码,我发现.any的执行速度比.aggany快得多。我认为他们在幕后是可比的。问:我的想法有点不同。使用您的代码,我发现.any的执行速度比.aggany快得多。我认为他们在幕后是可比的。有没有想过为什么?