我试图在dask数据帧中创建一个新列,其值将是来自另一个数据帧的特定索引值。在
import pandas as pd
import numpy as np
import dask.dataframe as dd
holdings=pd.DataFrame({'cusip': ['abcd', 'efgh', 'ijkl'], 'date': ['1/1/2000', '1/1/2005', '1/1/2010']})
ratings=pd.DataFrame({'cusip':['abcd','efgh','efgh'],'date':['1/1/2001','1/1/2004','1/1/2006'],'rating':['A','AAA','B']}
dd.from_pandas(df1, npartitions=2)
日期都是日期时间.日期类型。目标是,对于持有的每一行,新列将包含来自评级的索引,其中该行包含持有日期cusip的最新可用评级。例如,holdings中新列的第二行应该包含指向第二行评级的索引。在
我写了下面的代码,当持有量和评级只是熊猫数据框(而不是dask)时,它实现了我想要的:
^{pr2}$This post对于我需要应用于相同数据的一个更简单的函数很有帮助,但是当我试图将它用于此任务时,我得到了错误:“数组块大小未知:%s',(nan,),'发生在索引0处”。在
这正是我在dask中使用的代码(对pandas使用的函数稍作修改):
def get_rating_index(row):
if row['cusip'] in ratings['cusip'].values:
temp=ratings[ratings['cusip']==row['cusip']]
avail_ratings=temp[temp['date'].apply(lambda x: x<row['date'])]
if avail_ratings.shape[0]>0:
final=avail_ratings[avail_ratings['date']==max(avail_ratings['date'].values)]
return final.index[0]
else:
return -1
else:
return -1
holdings['ratings_match'] = holdings.apply(get_rating_index,meta='int', axis=1)
你知道如何在不出错的情况下做到这一点吗?我应该注意到,当我试图查看数据时(例如使用holdings.head()
)发生一次错误,而不是在创建列时立即发生。在
这还不是一个完整的答案,但可能会让您开始:
很有可能你真的想要}在这里。它们可以让你以更直接的方式从熊猫身上进行概括,而且通常效率更高。在
map
或{实际上,您正在运行的函数,
get_rating_index
感觉非常像一个单独的map或where操作,尽管很难判断其目的是什么。另一方面,temp=ratings[ratings['cusip']==row['cusip']]
看起来像一个groupby操作。在相关问题 更多 >
编程相关推荐