如何批量处理Python Pandas数据框?

时间:2016-09-08 22:02:00

标签: python pandas

我有三个非常长的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。)我花了几个小时就找不到解决方案了。有帮助吗?感谢。

2 个答案:

答案 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]tablea1tableb1tablec1连接时,这还没有被分配回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是原因。