在另一个数据框中使用值创建新的dask数据框列会导致"块大小未知"的问题

2024-06-28 19:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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())发生一次错误,而不是在创建列时立即发生。在


Tags: 数据importpandasdateindexasdaskrow
1条回答
网友
1楼 · 发布于 2024-06-28 19:23:19

这还不是一个完整的答案,但可能会让您开始:

holdings.apply(get_rating_index, meta='int', axis=1)

很有可能你真的想要map或{}在这里。它们可以让你以更直接的方式从熊猫身上进行概括,而且通常效率更高。在

实际上,您正在运行的函数,get_rating_index感觉非常像一个单独的map或where操作,尽管很难判断其目的是什么。另一方面,temp=ratings[ratings['cusip']==row['cusip']]看起来像一个groupby操作。在

相关问题 更多 >