通过使用for循环循环每个数据帧来处理数据帧

时间:2020-01-20 02:12:39

标签: python pandas

我尝试使用for循环对所有数据帧执行一些处理,而无需进行任何更改。

代码:

import pandas as pd

a = pd.DataFrame({'a':[1,2,3,4,5,6,7],
                 'b':[8,9,0,1,2,3,4]})
b = pd.DataFrame({'c':[1,2,3,4,5,6,7],
                 'b':[8,9,0,1,2,3,4]})

li = [a,b]
for i in li:
    'df_{}'.format(i) = i.rename(columns={'b':'test'})

a和b两者的输出:

    a   b
0   1   8
1   2   9
2   3   0
3   4   1
4   5   2
5   6   3
6   7   4

    c   b
0   1   8
1   2   9
2   3   0
3   4   1
4   5   2
5   6   3
6   7   4

预期输出:

    a   test
0   1   8
1   2   9
2   3   0
3   4   1
4   5   2
5   6   3
6   7   4

    c   test
0   1   8
1   2   9
2   3   0
3   4   1
4   5   2
5   6   3
6   7   4

谁能指出这里出了什么问题?我尝试在其他数据集上使用它,但是没有任何变化,我也不明白为什么。请帮忙。

顺便说一句,我想知道是否可以为它起一个不同的名字。上面编辑过吗?

3 个答案:

答案 0 :(得分:3)

inplace=True中使用rename

for i in li:
    i.rename(columns={'b':'test'}, inplace=True) # Without assignment

输出:

a.head()
   a  test
0  1     8
1  2     9
2  3     0
3  4     1
4  5     2

b.head()
   c  test
0  1     8
1  2     9
2  3     0
3  4     1
4  5     2

答案 1 :(得分:0)

重命名将创建一个新实例。

代替尝试:

for i in li:
    i = i.rename(columns={'b':'test'}, inplace=True)

答案 2 :(得分:0)

(编辑):

看起来您要转换的列正与复制的对象叠加。以下变通办法应解决此问题:

for i in li:
    f'df_{i}' = i.copy(deep=True)
    f'df_{i}' = f'df_{i}'.rename(columns={'b':'test'})