У меня есть вложенный цикл что-то вроде:

for x in df['text']:
  for i in x:
    if i in someList:
      count++

Где df['text'] - это серия списков, содержащих такие слова, как ['word1', 'word2', 'etc']
Я знаю, что могу просто использовать формат for, но я хочу преобразовать его в лямбда-функцию.
Я пытался сделать:
df['in'] = df['text'].apply(lambda x: [count++ for i in x if i in someList]) но это не правильный синтаксис. Как я могу изменить, чтобы получить функцию к тому, что я желаю?

2
cap 28 Июн 2019 в 17:25

3 ответа

Лучший ответ

Я чувствую, что вам нужно расходовать строку и делать с isin, поскольку с пандами мы обычно стараемся не использовать цикл.

df['in']=pd.DataFrame(df['text'].tolist(),index=df.index).isin(someList).sum(1)
2
YO and BEN_W 28 Июн 2019 в 14:27

Вам не нужны никакие дополнительные функции. Просто создайте последовательности единиц (по одному на элемент) для суммирования.

count = sum(1 for x in df['text'] for i in x if i in someList)
2
chepner 28 Июн 2019 в 14:27

Настроить

someList = [*'ABCD']
df = pd.DataFrame(dict(text=[*map(list, 'AB CD AF EG BH IJ ACDE'.split())]))

df

           text
0        [A, B]
1        [C, D]
2        [A, F]
3        [E, G]
4        [B, H]
5        [I, J]
6  [A, C, D, E]

Numpy и __contains__

i = np.arange(len(df)).repeat(df.text.str.len())
a = np.zeros(len(df), int)
np.add.at(a, i, [*map(someList.__contains__, np.concatenate(df.text))])
df.assign(**{'in': a})

           text  in
0        [A, B]   2
1        [C, D]   2
2        [A, F]   1
3        [E, G]   0
4        [B, H]   1
5        [I, J]   0
6  [A, C, D, E]   3

map lambda и __contains__

df.assign(**{'in': df.text.map(lambda x: sum(map(someList.__contains__, x)))})

           text  in
0        [A, B]   2
1        [C, D]   2
2        [A, F]   1
3        [E, G]   0
4        [B, H]   1
5        [I, J]   0
6  [A, C, D, E]   3
2
piRSquared 28 Июн 2019 в 14:37