Как сделать l oop для нескольких подмножеств, выполнить операции и перенести результаты в исходный кадр данных в python? - PullRequest
0 голосов
/ 14 января 2020

У меня есть фрейм данных с миллионами строк и около 100 000 уникальных идентификационных номеров. Я хочу выполнять операции для каждого уникального идентификатора. Сейчас я создаю подмножество для каждого уникального идентификатора и выполняю некоторые операции соответственно. Эта петля работает. Но как мне эффективно объединить подмножества в один фрейм данных?

Может быть, есть более эффективный способ выполнения операций для подмножества уникальных идентификаторов.

Спасибо

for ID in np.unique(df_fin['ID']):
    ID_subset = df_fin.loc[df_fin['ID'] == ID]

    for i in ID_subset.index:
        if ID_subset['date_diff'][i] > 0:
            for p in range(0,ID_subset['date_diff'][i]):
                if p == WIP:
                    sl.appendleft(ID_subset.return_bin[i-1])
                else:
                    sl.appendleft(0)

                lissa = list(sl)
                ID_subset.at[i,'list_stock'] = lissa

    frames = [ID_subset] #this does not work
    final_mod = pd.concat(frames) #this also does not work

ЭТО РАБОТАЕТ: Я также попробовал с groupby.apply. Смотрите код ниже.

def create_stocklist(x):
    x['date_diff'] = x['dates'] - x['dates'].shift()
    x['date_diff'] = x['date_diff'].fillna(0)
    x['date_diff'] = (x['date_diff'] / np.timedelta64(1, 'D')).astype(int)
    x['list_stock'] = x['list_stock'].astype(object)
    x['stock_new'] = x['stock_new'].astype(object)

    var_stock = DOS*[0]
    sl = deque([0],maxlen=DOS)

    for i in x.index:
        if x['date_diff'][i] > 0:
            for p in range(0,x['date_diff'][i]):
                if p == WIP:
                    sl.appendleft(x.return_bin[i-1])
                else:
                    sl.appendleft(0)

                lissa = list(sl)
                x.at[i,'list_stock'] = lissa
    return x

df_fin.groupby(by=['ID']).apply(create_stocklist)

1 Ответ

0 голосов
/ 14 января 2020

Подход может быть следующим:

for g, _id in df_din.groupby(by=['ID']):
    # do stuff with g

g - это кадр данных, содержащий все строки, такие что df_fin['ID'] == _id

...