将映射 lambda 转换为列表理解
Convert map lambda to list comprehension
对于...
import pandas as pd
df = pd.DataFrame({'a': 1, 'b': range(4)})
def sumthis(a, b):
return a+b
df['sum'] = list(map(lambda x, y: sumthis(x, y), [i for i in df.a], [j for j in df.b]))
...什么是列表理解?
list(map(lambda x, y: sumthis(x, y), [i for i in df.a], [j for j in df.b]))
使用zip
:
df['sum'] = [sumthis(x, y) for x, y in zip(df.a, df.b)]
print (df)
a b sum
0 1 0 1
1 1 1 2
2 1 2 3
3 1 3 4
这里的列表推导是不必要的。 Pandas 系列对象是可迭代的,不需要列表转换。此外,通过理解将系列转换为列表效率低下。为了证明后一点,您可以更有效地使用 pd.Series.tolist
:
df['sum'] = list(map(lambda x, y: sumthis(x, y), df['a'].tolist(), df['b'].tolist()))
相反,您可以使用单个列表理解:
df['sum'] = [sumthis(a, b) for a, b in zip(df['a'], df['b'])]
但是,在可能的情况下,您应该更喜欢向量化操作以利用底层 NumPy 数组。在这个微不足道的案例中:
df['sum'] = df['a'] + df['b']
对于...
import pandas as pd
df = pd.DataFrame({'a': 1, 'b': range(4)})
def sumthis(a, b):
return a+b
df['sum'] = list(map(lambda x, y: sumthis(x, y), [i for i in df.a], [j for j in df.b]))
...什么是列表理解?
list(map(lambda x, y: sumthis(x, y), [i for i in df.a], [j for j in df.b]))
使用zip
:
df['sum'] = [sumthis(x, y) for x, y in zip(df.a, df.b)]
print (df)
a b sum
0 1 0 1
1 1 1 2
2 1 2 3
3 1 3 4
这里的列表推导是不必要的。 Pandas 系列对象是可迭代的,不需要列表转换。此外,通过理解将系列转换为列表效率低下。为了证明后一点,您可以更有效地使用 pd.Series.tolist
:
df['sum'] = list(map(lambda x, y: sumthis(x, y), df['a'].tolist(), df['b'].tolist()))
相反,您可以使用单个列表理解:
df['sum'] = [sumthis(a, b) for a, b in zip(df['a'], df['b'])]
但是,在可能的情况下,您应该更喜欢向量化操作以利用底层 NumPy 数组。在这个微不足道的案例中:
df['sum'] = df['a'] + df['b']