这个命令究竟在做什么?

时间:2015-01-19 19:38:54

标签: python pandas lambda

这行代码完美无缺,但我并没有真正掌握它实际做的事情:

df['New_Column1'], shrink['New_Column2'] = zip(*df['Original_Column'].apply(lambda x: x.split('-', 1)))

这基本上是将一个列拆分到一个破折号,该破折号将员工ID号和它们的实际名称分开(在原始数据中它们合并在一列中)。

这是最有效的方法吗?我怎么能向别人描述这个?我从未使用过' zip'以前的功能和我不是100%与lambda,但我有时用它来改变日期格式。

2 个答案:

答案 0 :(得分:2)

apply方法为系列的每一行调用一次lambda函数, df['Original Column']。为每行调用一次Python函数是一个配方 缓慢(如果系列有很多行)。一般来说,要最大限度地提高性 使用Pandas时,如果没有其他选项,则只使用apply方法。

使用zip会降低效率。 zip返回一个Python列表 元组。 Python列表和元组比Pandas系列需要更多的空间 当系列内的值是本机NumPy dtype时。字符串可以 由本机NumPy dtype表示,因此将数据保存在Series中更多 节省空间的。因此,如果可能,应尽量避免使用zip,例如apply

在这种情况下,您可以代替Panda的vectorized string method, extract

df = pd.DataFrame({'Original':['abc-def']*3+['foo']})
#   Original
# 0  abc-def
# 1  abc-def
# 2  abc-def
# 3      foo

df[['New1', 'New2']] = df['Original'].str.extract(r'([^-]*)-?(.*)')
print(df)

产量

  Original New1 New2
0  abc-def  abc  def
1  abc-def  abc  def
2  abc-def  abc  def
3      foo  foo     

extract的参数是正则表达式模式。 r'([^-]*)-?(.*)'具有以下含义:

([^-]*)     match 0-or-more characters other than a literal hyphen
-?          match 0-or-1 literal question mark
(.*)        match 0-or-more of any character

由括号括起来的模式定义了由然后返回的组 extract方法。

答案 1 :(得分:0)

是的,你是对的,这基本上是将一个列拆分到一个破折号,该破折号将员工ID号和它们的实际名称分开(在原始数据中它们合并在一列中)。

我会详细介绍ziplambda做的事情:

zipfrom the docs

  

此函数返回元组列表,其中第i个元组包含每个参数序列或可迭代的第i个元素。

示例

>>> my_list1 = [1, 2, 3, 4, 5]
>>> my_list2 = ['a', 'e', 'i', 'o', 'u']
>>> zip(my_list1, my_list2) #Returns a list of tuples, each tuple has a number corresponding to its number vowel.
[(1, 'a'), (2, 'e'), (3, 'i'), (4, 'o'), (5, 'u')]
>>> 

lambdafrom the docs

  

可以使用lambda关键字创建小的匿名函数。此函数返回其两个参数的总和:lambda a,b:a + b

示例

>>> #Writing a function that squares numbers
>>>
>>> #Long way 
>>> def square(x):
...     return x**2
... 
>>>
>>> #Short way 
>>> square = lambda x: x**2
>>>