使用lambda函数嵌套for循环

时间:2019-06-28 14:25:12

标签: python pandas lambda

我有一个嵌套的for循环,例如:

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

df['text']是一系列包含['word1', 'word2', 'etc']之类单词的列表,
我知道我可以只使用for格式,但我想将其转换为lambda函数。
我尝试做:
df['in'] = df['text'].apply(lambda x: [count++ for i in x if i in someList]) 但这不是正确的语法。如何修改以使功能达到我的期望?

3 个答案:

答案 0 :(得分:2)

我觉得您需要扩展行并使用isin,因为对于熊猫,我们通常不尝试使用for loop。

df['in']=pd.DataFrame(df['text'].tolist(),index=df.index).isin(someList).sum(1)

答案 1 :(得分:2)

您不需要任何其他功能。只需创建一个序列(每个元素一个)即可求和。

count = sum(1 for x in df['text'] for i in x if i in someList)

答案 2 :(得分:2)

设置

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