【发布时间】:2021-04-22 09:20:22
【问题描述】:
我需要将数据帧中的列传递给一个函数,该函数作为回报提供一个字典,该字典需要附加到同一数据帧中的 2 列结果和成本中。
例如函数是:
def costsplit (acc, srv, owner, cost):
test = splitter().split(acc, srv, owner, cost)
return test
假设 dev 的测试返回的数据字典类型是 test = {'dps':32, 'dd':21, 'ct':92, 'cc':32}。
这意味着当 acc = dev, srv = instance owner = dpc is cost =30 被传递时,{'dps':32, 'dd':21, 'ct':92, 'cc':32} 被测试返回,即下面数据帧的第 1 行,同样的一些其他输出 {'dps':20, 'dd':21, 'ct':92, 'cc':2} 在 acc = prd, srv = instance, owner = abs, cost =35 被传递时被测试返回,即第 4 行,它们是附加在数据框中的结果和成本列中。
当前数据框如下所示:
date acc srv owner result cost
2021-03-01 dev bucket dps gcp.dev.dps 177
2021-03-01 prd instance abs gcp.prd.abs 35
2021-03-01 dev spanner cc gcp.dev.cc 98
2021-03-01 prd instance it gcp.prd.it 135
现在输出数据帧应该附加到字典键值对中的result 和cost 列中。
输出应该是这样的:
date acc srv owner result cost
2021-03-01 dev bucket dps gcp.dev.dps 177
2021-03-01 prd instance abs gcp.prd.abs 35
2021-03-01 dev spanner cc gcp.dev.cc 98
2021-03-01 prd instance it gcp.prd.it 135
2021-03-01 gcp.dev.dps 32
2021-03-01 gcp.dev.dd 21
2021-03-01 gcp.dev.ct 92
2021-03-01 gcp.dev.cc 32
2021-03-01 gcp.prd.dps 20
2021-03-01 gcp.prd.dd 21
2021-03-01 gcp.prd.ct 92
2021-03-01 gcp.prd.cc 2
即循环在当前数据帧的每一行上运行 acc, srv, owner, cost 列数据传递给 costsplit 函数应该附加到 result 部分中的每个 gcp.{acc}.{testkey} 和 test 值被添加到 cost 列中被test 返回。
splitter().split 函数根据从数据帧发送的每一行划分成本并重命名所有者。
使用以下命令,我只能附加 result 函数,而不是 cost 一个。
acc['result'] = acc.apply(lambda x: [f'gcp.{acc}.{squ}' for squ, cost in test.items()], axis=1)
【问题讨论】:
-
如何将
{'dps':32, 'dd':21, 'ct':92, 'cc':32}转换为结果列中您期望的值?为什么dps转换为gcp.dev.dps而dd转换为gcp.sandbox.dd? -
@Mortz 这是因为在传递
costsplit函数时dps 有acc dev。而对于 dd,重复可能发生在沙箱中。要点是gcp.{acc}.{test.key}这种类型的格式应该形成result列,其中acc 是运行函数的帐户,gcp 是固定的,test.key 是该行acc 输出的键。 -
@Mortz 所以结果被附加到数据帧中的所有行,同时为 acc srv 和 owner 和 cost 传递。
-
@Mortz 我对问题进行了一些更改,可能会帮助您更深入地了解问题。感谢您的努力:)
标签: python python-3.x pandas dataframe