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