Как использовать «Применить», чтобы быстро определить, к какому столбцу относятся строки? - PullRequest
1 голос
/ 22 января 2020

У меня есть объект eps, который является list, и в этом объекте есть набор имен столбцов: [col1, col2, col3, ...]. У меня также есть DataFrame со столбцом с именем features. В этом столбце вы найдете list, который содержит цифры: [1,4,5,13,17,20, ...]. Я хочу использовать метод apply(), чтобы определить, с каким столбцом (в eps) связаны значения строк. Итак, row['features'] = [1,3,4,6]; eps[1] = col2. Поэтому col2 = True, иначе, если число в features не связано ни с одним столбцом в eps, col_n = False.

Есть ли простой способ сделать это с помощью метода pandas apply?

Вот некоторый псевдо-код:

feats= []
for row in df["features"]:
    for i in range(len(eps)):
        if i in row:
            feats.append(True)
        else:
            feats.append(False)

Это работает, но очень медленно, и я знаю, что .apply() значительно ускорит это. Я уже переключился на .iterrows(), но он все еще недостаточно хорош. Пожалуйста, помогите!

Первые 4 элемента в df['features'] могут быть:

[1,4,6,12,45,67]
[3,6,7,8,10,39,57,64,65]
[2,9,10,11,57,58,60,71,75]
[1,4,10,76,584]

1 Ответ

1 голос
/ 22 января 2020

features - это серия списков, поэтому я думаю, что вы не можете избежать l oop. Дайте списку понять, помогает ли он на скорости

eps_tfs = {col:[] for col in eps}
features = [i in l  for l in df['features'] for i in range(len(eps))]
n = 0
for b in features:
    if b == True:
        try:
            eps_tfs[eps[n]].append(True)
        except:
            n = 0
            eps_tfs[eps[n]].append(True)
    else:
        try:
            eps_tfs[eps[n]].append(False)
        except:
            n = 0
            eps_tfs[eps[n]].append(False)
    n += 1

df = pd.concat([df, pd.DataFrame(eps_tfs)], axis=1)

Out[1007]:
[False,
 True,
 False,
 False,
 True,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 True,
 True,
 True,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 True,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False]

Примечание : мой образец eps имеет длину 19, поэтому мой вывод имеет длину 76 в виде 4 строк по df.features умножает 19, получая список feat из 76 элементов

...