我有三个非常长的Pandas数据框列表。例如:
list_a = [tablea1, tablea2, tablea3, tablea4]
list_b = [tableb1, tableb2, tableb3, tableb4]
list_c = [tablec1, tablec2, tablec3, tablec4]
我想做这样的事情:
tablea1 = pd.concat([tablea1, tableb1, tablec1], axis=1)
天真地,我写了这样的代码:
for i in range(len(list_a)):
list_a[i] = pd.concat([list_a[i], list_b[i], list_c[i]], axis=1)
此代码无法正常工作,b / c list_a [0]最初是对tablea1的引用,然后在循环内部,list_a [0]将被重新分配为指向
pd.concat([tablea1, tableb1, tablec1], axis=1),
这是一个新对象。最后,tablea1没有被修改。 (list_a确实包含了所需的结果。但我确实想修改tablea1。)我花了几个小时就找不到解决方案了。有帮助吗?感谢。
答案 0 :(得分:0)
@qqzj您将遇到的问题是python并没有完全具备此功能。作为@Boud mentions,连接后对tablea1,tableb1,tablec1等的引用将丢失。
我将说明一个快速而肮脏的解决方法示例(效率非常低,但可以完成工作)。
如果没有您的数据,我基本上会创建随机数据帧。
tablea1 = pd.DataFrame(np.random.randn(10, 4))
tableb1 = pd.DataFrame(np.random.randn(10, 4))
tablec1 = pd.DataFrame(np.random.randn(10, 4))
tablea2 = pd.DataFrame(np.random.randn(10, 4))
tableb2 = pd.DataFrame(np.random.randn(10, 4))
tablec2 = pd.DataFrame(np.random.randn(10, 4))
应用您的代码迭代此列表
list_a = [tablea1, tablea2]
list_b = [tableb1, tableb2]
list_c = [tablec1, tablec2]
for i in range(len(list_a)):
list_a[i] = pd.concat([list_a[i], list_b[i], list_c[i]], axis=1)
在此处运行比较后,您会看到已突出显示的问题,即当list_a[i]
与tablea1
,tableb1
和tablec1
连接时,这还没有被分配回tablea1
。
正如我在评论中提到的,答案是为tablea1
分配列表[0]
tablea1=list_a[0]
您可以对tablea2
tablea3
等重复此操作。
进行比较,您现在可以看到tablea1与list [0]
中的值匹配tablea1==list_a[0]
0 1 2 3 0 1 2 3 0 1 2 3
0 True True True True True True True True True True True True
1 True True True True True True True True True True True True
2 True True True True True True True True True True True True
3 True True True True True True True True True True True True
4 True True True True True True True True True True True True
5 True True True True True True True True True True True True
6 True True True True True True True True True True True True
7 True True True True True True True True True True True True
8 True True True True True True True True True True True True
9 True True True True True True True True True True True True
同样,这不是理想的解决方案,但您所寻找的并不是“pythonic”。办法。
答案 1 :(得分:0)
感谢zhqiat的示例代码。让我稍微介绍一下。这里可以使用exec语句解决这个问题。
import pandas as pd
import numpy as np
tablea1 = pd.DataFrame(np.random.randn(10, 4))
tableb1 = pd.DataFrame(np.random.randn(10, 4))
tablec1 = pd.DataFrame(np.random.randn(10, 4))
tablea2 = pd.DataFrame(np.random.randn(10, 4))
tableb2 = pd.DataFrame(np.random.randn(10, 4))
tablec2 = pd.DataFrame(np.random.randn(10, 4))
list_a = [tablea1, tablea2]
list_b = [tableb1, tableb2]
list_c = [tablec1, tablec2]
for i in range(1, len(list_a)+1):
exec 'tablea' + str(i) + ' = pd.concat([tablea' + str(i) + ', ' + 'tableb' + str(i) + ', ' + 'tablec' + str(i) + '], axis=1)'
print tablea1
我一直在使用这种方法。但是在代码变得更加复杂之后。 exec开始抱怨
'SyntaxError: unqualified exec is not allowed in function 'function name' it contains a nested function with free variables'.
以下是有问题的代码:
def overall_function():
def dummy_function():
return True
tablea1 = pd.DataFrame(np.random.randn(10, 4))
tableb1 = pd.DataFrame(np.random.randn(10, 4))
tablec1 = pd.DataFrame(np.random.randn(10, 4))
tablea2 = pd.DataFrame(np.random.randn(10, 4))
tableb2 = pd.DataFrame(np.random.randn(10, 4))
tablec2 = pd.DataFrame(np.random.randn(10, 4))
list_a = ['tablea1', 'tablea2']
list_b = ['tableb1', 'tableb2']
list_c = ['tablec1', 'tablec2']
for i, j, k in zip(list_a, list_b, list_c):
exec(i + ' = pd.concat([' + i + ',' + j + ',' + k + '], axis=1)')
print tablea1
overall_function()
此代码将生成错误消息。有趣的是,在我的真实功能中根本没有其他“def”声明。所以我没有嵌套函数。我很困惑为什么我收到这样的错误信息。我的问题是,是否有办法让Python告诉我哪个变量是罪魁祸首,即导致问题的自由变量?或者,哪个子函数负责我的代码失败。理想情况下,对于这个例子,我希望我可以强制python告诉我dummy_function是原因。