Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对数据帧行进行高效迭代以计算新数据帧的值_Python_Pandas - Fatal编程技术网

Python 对数据帧行进行高效迭代以计算新数据帧的值

Python 对数据帧行进行高效迭代以计算新数据帧的值,python,pandas,Python,Pandas,我试图创建一个数据框架,其中列与售出商品的ID相关,行索引是购买这些商品的客户的ID。单元格应显示每个客户购买每件商品的金额。为了获得这些信息,我读取了CSV文件,该文件包含客户进行的每一笔交易的一行 该文件被解析为frame_变量。我在相应的列上使用unique()函数检索客户和文章ID,并使用它们创建一个新的数据框架,将这些ID作为列标题和行索引 with open(f"{file_path}") as file: frame_ = pd.read_csv(fil

我试图创建一个数据框架,其中列与售出商品的ID相关,行索引是购买这些商品的客户的ID。单元格应显示每个客户购买每件商品的金额。为了获得这些信息,我读取了CSV文件,该文件包含客户进行的每一笔交易的一行

该文件被解析为
frame_
变量。我在相应的列上使用
unique()
函数检索客户和文章ID,并使用它们创建一个新的数据框架,将这些ID作为列标题和行索引

with open(f"{file_path}") as file:
    frame_ = pd.read_csv(file, sep="\t", header=None)
    
    customer_ids = list(frame_[customer_index].unique())
    item_ids = list(frame_[item_index].unique())
    
    frame = pd.DataFrame.from_dict(
        dict.fromkeys(item_ids, dict.fromkeys(customer_ids, 0)))
在下一步中,我想在
frame\uuz
上迭代检查每一行的3个值:

  • 客户ID
  • 项目ID
  • 售出物品的数量
  • 该金额应添加到当前值的
    帧。在[customer\u id,item\u id]

    for index, row in frame_.iterrows():
        customer = row[customer_index]
        item = row[item_index]
        amount = abs(float(row[2]))
    
        frame.at[customer, item] += amount
    
    由于我使用了
    iterrows()

    ,这部分速度特别慢 我看了一些问题,但因为我不太清楚我到底在寻找什么,所以我找不到任何关于如何更有效地执行任务的解决方案

    感谢您的时间和您能提供的任何建议

    编辑:原始文件和
    frame
    dataframe包含约2.5 mil行

    编辑2:添加了
    框架的摘录
    ,“…”包含与本部分无关的其他信息。列标题实际上为0-8,添加了“ID”、“金额”、“itemID”和“customerID”以提高可读性:

    ID ... amount ... ... itemID ... customerID ...
    1  ... -5.0    ... ... 1258   ... 805214     ...
    2  ... -10.0   ... ... 3658   ... 798125     ...
    3  ... -7.5    ... ... 2056   ... 589012     ...
    
    编辑3:预期输出如下所示:

           1258 3658 2056
    805214 5.0  0    0
    798125 0    10.0 0
    589012 0    0    7.5
    

    首先准备另一列金额的绝对值(尽管我不完全理解您需要什么
    abs
    float
    ——您的金额不是已经是正数了吗?)

    然后按客户和项目索引汇总:

    frame = frame_.groupby(["customerID", "itemID"])["amount1"].sum()
    
    不需要显式迭代。如果需要,可以将结果转换为“宽”格式:

    frame.unstack().fillna(0)
    #itemID      1258  2056  3658
    #customerID                  
    #589012       0.0   7.5   0.0
    #798125       0.0   0.0  10.0
    #805214       5.0   0.0   0.0
    

    你考虑过并行运行吗?这很容易。这是一个问题,你真的有负数吗?打电话给abs有什么意义?它们是负面的,因为销售将它们从库存中“删除”。我调用
    abs
    将它们转换为正值,这对我来说似乎更直观,但我得到以下错误:AttributeError:“DataFrame”对象没有属性“groupy”,是的,我可能不需要
    float
    强制转换。我只是有时候想确定一下,当然不是。错别字全是你的了。好吧,对不起,我的错。非常感谢-它似乎工作得很好!您可能需要再次检查是否需要
    abs
    。在你的问题中,这感觉完全不合适。
    frame.unstack().fillna(0)
    #itemID      1258  2056  3658
    #customerID                  
    #589012       0.0   7.5   0.0
    #798125       0.0   0.0  10.0
    #805214       5.0   0.0   0.0