我正在尝试使用第二个数据帧在pandas数据框中添加和更新多个列。我得到的问题是当我想要添加的列数与基础数据帧中的列数不匹配时,我得到以下错误:“传递值的形状是(2,3),索引暗示(2,2) )“
问题的简化版本如下
tst = DataFrame({"One":[1,2],"Two":[2,4]})
def square(row):
"""
for each row in the table return multiple calculated values
"""
a = row["One"]
b = row["Two"]
return a ** 2, b ** 2, b ** 3
#create three new fields from the data
tst[["One^2", "Two^2", "Two^3"]] = tst.apply(square, axis=1)
如果添加的字段数与表中已有的字段匹配,则opertaion按预期工作。
tst = DataFrame({"One":[1,2],"Two":[2,4]})
def square(row):
"""
for each row in the table return multiple calculated values
"""
a = row["One"]
b = row["Two"]
return a ** 2, b ** 2
#create three new fields from the data
tst[["One^2", "Two^2"]] = tst.apply(square, axis=1)
我意识到我可以单独执行每个字段但是在我试图解决的实际问题中,我在正在更新的表和“updater”(即square)中的外部表之间执行连接并希望能够抓取所有必需的信息一次性。
下面是我在SQL中如何做到这一点。不幸的是,这两个数据帧包含来自不同数据库技术的数据,因此我必须在pandas中执行操作。
update tu
set tu.a_field = upd.the_field_i_want
tu.another_field = upd.the_second_required_field
from to_update tu
inner join the_updater upd
on tu.item_id = upd.item_id
and tu.date between upd.date_from and upd.date_to
在这里,您可以看到我正在尝试做的具体细节。我有一个表“to_update”,其中包含针对item_id的时间点信息。另一个表“the_updater”包含针对item_id的日期范围信息。例如,特定的item_id可以与customer_1一起从DateA到DateB,customer_2在DateB和DateC之间。我希望能够将包含日期范围的表中的信息与时间点表对齐。
请注意,由于数据问题,合并将无效(这实际上是作为数据质量测试的一部分编写的)。我真的需要能够复制上面更新语句的功能。
我显然可以将其作为循环进行,但我希望尽可能使用pandas框架。
答案 0 :(得分:0)
在数据框中声明一个空列并将其指定为零
tst["Two^3"] = 0
然后对该列进行相应的操作以及其他列
tst[["One^2", "Two^2", "Two^3"]] = tst.apply(square, axis=1)
尝试打印
print tst.head(5)