这行代码完美无缺,但我并没有真正掌握它实际做的事情:
df['New_Column1'], shrink['New_Column2'] = zip(*df['Original_Column'].apply(lambda x: x.split('-', 1)))
这基本上是将一个列拆分到一个破折号,该破折号将员工ID号和它们的实际名称分开(在原始数据中它们合并在一列中)。
这是最有效的方法吗?我怎么能向别人描述这个?我从未使用过' zip'以前的功能和我不是100%与lambda,但我有时用它来改变日期格式。
答案 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号和它们的实际名称分开(在原始数据中它们合并在一列中)。
我会详细介绍zip
和lambda
做的事情:
此函数返回元组列表,其中第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')]
>>>
可以使用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
>>>