你能告诉我什么时候使用这些矢量化方法和基本的例子吗?
我看到这map
是一种Series
方法,而其余的是DataFrame
方法.我对此感到困惑apply
和applymap
方法.为什么我们有两种方法将函数应用于DataFrame?再一次,说明用法的简单例子会很棒!
假设我有一个df
列'ID', 'col_1', 'col_2'
.我定义了一个函数:
f = lambda x, y : my_function_expression
.
现在我想应用f
to df
的两列'col_1', 'col_2'
来逐元素地计算一个新列'col_3'
,有点像:
df['col_3'] = df[['col_1','col_2']].apply(f)
# Pandas gives : TypeError: ('<lambda>() takes exactly 2 arguments (1 given)'
Run Code Online (Sandbox Code Playgroud)
怎么做 ?
** 添加详细示例如下 ***
import pandas as pd
df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']
def get_sublist(sta,end):
return mylist[sta:end+1]
#df['col_3'] = df[['col_1','col_2']].apply(get_sublist,axis=1)
# expect above to output df as below
ID col_1 col_2 col_3
0 1 0 …
Run Code Online (Sandbox Code Playgroud) 我尝试过与其他问题不同的方法,但似乎仍无法找到问题的正确答案.关键的一点是,如果这个人被算作西班牙裔,他们就不能算作别的了.即使他们在另一个种族栏目中有"1",他们仍被视为西班牙裔,而不是两个或更多种族.同样,如果所有ERI列的总和大于1,则它们被计为两个或更多种族,不能被视为独特的种族(接受西班牙裔).希望这是有道理的.任何帮助将不胜感激.
它几乎就像在每行中执行for循环一样,如果每条记录符合条件,它们将被添加到一个列表中并从原始列表中删除.
从下面的数据框中,我需要根据以下内容计算新列:
========================= CRITERIA ======================== =======
IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic”
ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More”
ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native”
ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian”
ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA”
ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.”
ELSE IF [ERI_White] = 1 THEN RETURN “White”
Run Code Online (Sandbox Code Playgroud)
评论:如果西班牙裔美国人的ERI标志为真(1),那么员工被归类为"西班牙裔"
评论:如果超过1个非西班牙语ERI标志为真,则返回"两个或更多"
====================== DATAFRAME =========================== …
我想pandas
通过将函数应用于两个现有列来在数据框中创建新列.根据这个答案,当我只需要一列作为参数时,我就能够创建一个新列:
import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
def fx(x):
return x * x
print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)
Run Code Online (Sandbox Code Playgroud)
但是,当函数需要多个参数时,我无法弄清楚如何做同样的事情.例如,如何通过将列A和列B传递给下面的函数来创建新列?
def fxy(x, y):
return x * y
Run Code Online (Sandbox Code Playgroud) 这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply
很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply
很慢.我还在文档中看到了一个关于如何apply
简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply
如果可能,应该避免.但是,这引发了以下问题:
apply
是如此糟糕,那为什么它在API中呢?apply
- 免费?apply
是不错的(比其他可能的解决方案更好)?我有一个pandas数据框,sample
其中一个被调用的列PR
应用了lambda函数,如下所示:
sample['PR'] = sample['PR'].apply(lambda x: NaN if x < 90)
Run Code Online (Sandbox Code Playgroud)
然后,我得到以下语法错误消息:
sample['PR'] = sample['PR'].apply(lambda x: NaN if x < 90)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
对于大型数据帧(大约1~3百万行),应用函数似乎工作得非常慢.
我在这里检查了相关的问题,比如加速熊猫应用功能,以及在pandas apply()函数中计数,似乎加速它的最好方法是不使用apply函数:)
对于我的情况,我有两种与apply函数有关的任务.
第一:应用查找字典查询
f(p_id, p_dict):
return p_dict[p_dict['ID'] == p_id]['value']
p_dict = DataFrame(...) # it's another dict works like lookup table
df = df.apply(f, args=(p_dict,))
Run Code Online (Sandbox Code Playgroud)
第二:适用于groupby
f(week_id, min_week_num, p_dict):
return p_dict[(week_id - min_week_num < p_dict['WEEK']) & (p_dict['WEEK'] < week_id)].ix[:,2].mean()
f_partial = partial(f, min_week_num=min_week_num, p_dict=p_dict)
df = map(f, df['WEEK'])
Run Code Online (Sandbox Code Playgroud)
我想对于第一种情况,它可以通过数据帧连接完成,而我不确定这种连接在大型数据集上的资源成本.
我的问题是:
我想生成包含NaN
在数据框中的随机浮点数np.random.randn
pandas ×8
python ×7
apply ×2
dataframe ×2
numpy ×2
lambda ×1
performance ×1
python-2.7 ×1
python-3.x ×1