Ускоренный путь к ГруппеПрименить Python Pandas? - PullRequest
0 голосов
/ 07 марта 2020

Как я могу заставить приложение Groupby работать быстрее или как я могу написать по-другому?

import numpy as np
import pandas as pd

df = pd.DataFrame({'ID':[1,1,1,1,1,2,2,2,2,2],\
                   'value':[1,2,np.nan,3,np.nan,1,2,np.nan,4,np.nan]})

result = df.groupby("ID").apply(lambda x: len(x[x['value'].notnull()].index)\
                    if((len(x[x['value']==1].index)>=1)&\
                    (len(x[x['value']==4].index)==0)) else 0)

вывод:

Index  0  
1      3  
2      0

Моя программа сейчас работает очень медленно , Могу ли я сделать это быстрее? Раньше я фильтровал перед использованием groupby (), но не вижу простого способа сделать это в этой ситуации.

1 Ответ

0 голосов
/ 07 марта 2020

Не уверен, что это то, что вам нужно. Я немного разложил его, но вы можете легко разбить его по цепочке, чтобы получить более компактный код:

df = pd.DataFrame(
    {
        "ID": [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
        "value": [1, 2, np.nan, 3, np.nan, 1, 2, np.nan, 4, np.nan],
    }
)

df["x1"] = df["value"] == 1
df["x2"] = df["value"] == 4

df2 = df.groupby("ID").agg(
    y1=pd.NamedAgg(column="x1", aggfunc="max"),
    y2=pd.NamedAgg(column="x2", aggfunc="max"),
    cnt=pd.NamedAgg(column="value", aggfunc="count"),
)

df3 = df2.assign(z=lambda x: (x['y1'] & ~x['y2'])*x['cnt'])

result = df3.drop(columns=['y1', 'y2', 'cnt'])
print(result)

, что даст

    z
ID   
1   3
2   0
...