gpt4 book ai didi

python - Pandas:如何使用 apply 创建新的数据框

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:17 27 4
gpt4 key购买 nike

我在 Python Pandas 中发现了一个奇怪的行为,想问问这是我的错还是一个实际的程序错误。让我们采用以下 DataFrame:

data = DataFrame({'k2':[1, 2, 3, ], 'name':['joe', 'mark', 'carl']})
data.set_index('name', drop=False, inplace=True)

如果我创建一个返回这样的 Series 对象的函数

def my_test(i, x):
x['interrel'] = x.apply(lambda row: i['k2'] - row['k2'] if i['name'] != row['name'] else 0, axis=1)
print x['interrel']
return x['interrel']

并使用appy该函数应用到创建的DataFrame使用

  data.apply(lambda row: my_test(row, data), axis=1)

我在输出中得到的只是最后计算的行乘以三。然而,my_test函数中的打印语句表明计算是正确的。似乎只有特定的系列对象未正确附加。

你能重构这个问题吗?我在使用 apply 函数时有什么错误吗?

请考虑这只是一个例子,我并不是要求另一种方法来在 Pandas 中进行成对差异

感谢任何帮助

最佳答案

因为您将 data df 作为引用传递,并每次通过在 func 中调用 apply 直接分配给它,然后它会覆盖最后一个操作:

In [20]:

def my_test(i, x):
x['interrel'] = x.apply(lambda row: i['k2'] - row['k2'] if i['name'] != row['name'] else 0, axis=1)
#print(x['interrel'])
print("x-----",x, "\n-------")
return x['interrel']
data.apply(lambda row: my_test(row, data), axis=1)
x----- k2 name interrel
name
joe 1 joe 0
mark 2 mark -1
carl 3 carl -2
-------
x----- k2 name interrel
name
joe 1 joe 0
mark 2 mark -1
carl 3 carl -2
-------
x----- k2 name interrel
name
joe 1 joe 1
mark 2 mark 0
carl 3 carl -1
-------
x----- k2 name interrel
name
joe 1 joe 2
mark 2 mark 1
carl 3 carl 0
-------
Out[20]:
name joe mark carl
name
joe 2 1 0
mark 2 1 0
carl 2 1 0

正如您所发现的,如果您传递数据的副本,然后对原始数据的副本执行操作并返回正确的结果,您可以看到 data df 是不受影响:

 In [22]:

def my_test(i, x):
x['interrel'] = x.apply(lambda row: i['k2'] - row['k2'] if i['name'] != row['name'] else 0, axis=1)
#print(x['interrel'])
print("x-----",x, "\n-------")
return x['interrel']
print(data.apply(lambda row: my_test(row, data.copy()), axis=1))
print(data)
x----- k2 name interrel
name
joe 1 joe 0
mark 2 mark -1
carl 3 carl -2
-------
x----- k2 name interrel
name
joe 1 joe 0
mark 2 mark -1
carl 3 carl -2
-------
x----- k2 name interrel
name
joe 1 joe 1
mark 2 mark 0
carl 3 carl -1
-------
x----- k2 name interrel
name
joe 1 joe 2
mark 2 mark 1
carl 3 carl 0
-------
name joe mark carl
name
joe 0 -1 -2
mark 1 0 -1
carl 2 1 0
k2 name interrel
name
joe 1 joe 2
mark 2 mark 1
carl 3 carl 0

关于python - Pandas:如何使用 apply 创建新的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30164132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com