Python 在alist中存储两个数据帧,对它们执行操作,但原始df保持不变

Python 在alist中存储两个数据帧,对它们执行操作,但原始df保持不变,python,pandas,list,dataframe,Python,Pandas,List,Dataframe,我有两个称为a和b的数据帧。我将它们存储在一个列表中 然后,我遍历列表中的每一项,删除所有空值的列,并更改数据帧。然后对两个dfs执行内部合并 然而,当我检查合并的df的形状时,它具有以前从每个原始数据帧中删除的所有列 请问,有人能告诉我为什么会发生这种情况吗?这是因为当我将数据帧存储在列表中时,正在创建数据帧的副本 多谢各位 a['one'] = [1, 2, 3, 4, 5] a['two'] = np.nan b = pd.DataFrame() b['three'] = [1, 2,

我有两个称为a和b的数据帧。我将它们存储在一个列表中
然后,我遍历列表中的每一项,删除所有空值的列,并更改数据帧。然后对两个dfs执行内部合并

然而,当我检查合并的df的形状时,它具有以前从每个原始数据帧中删除的所有列

请问,有人能告诉我为什么会发生这种情况吗?这是因为当我将数据帧存储在列表中时,正在创建数据帧的副本

多谢各位

a['one'] = [1, 2, 3, 4, 5]
a['two'] = np.nan

b = pd.DataFrame()
b['three'] = [1, 2, 3, 4, 5]
b['four'] = np.nan

lis = [a, b]
for item in lis:
    item = item.dropna(axis=1,how='all')
    print(item.shape)
This prints (5,1) for both

c = pd.merge(a, b, left_on= 'one', right_on='three', how='inner')
c.shape
This print(5,4) which I expect to be (5,2)

请尝试此操作,使用dropna的
inplace
参数,而不是重新分配:

lis = [a, b]
for item in lis:
    item.dropna(axis=1,how='all', inplace=True)
输出

118567488
118567488
[148747432, 148749840]
相反,你应该:

import pandas as pd
import numpy as np


a = pd.DataFrame()
ida = id(a)
a['one'] = [1, 2, 3, 4, 5]
a['two'] = np.nan

b = pd.DataFrame()
idb = id(a)
b['three'] = [1, 2, 3, 4, 5]
b['four'] = np.nan

lis = [a, b]
lis = [x.dropna(axis='columns',how='all', inplace=False) for x in lis]

from functools import reduce
c = reduce(lambda x, y: pd.merge(x, y, left_on= 'one', right_on='three', how='inner'), lis)

请发布您的代码或问题的解决方案。这很有效。谢谢请你解释一下为什么这是有效的,而不是重新分配我相信这是一个不同的范围问题。因为项是在for循环中定义的,所以您要在dropna之后写入以分离内存。但是,使用“inplace=True”似乎可以更新当前的内存分配。实际上,这是我第一次看到重新分配给同一变量的函数与使用inplace=True的函数之间的差异。@Moshee,因为对于lis中的项:循环中的每个迭代,名称
是指向名为
lis
的列表中指向的同一对象的指针。在循环中执行
item=item.dropna(axis=1,how='all')
时,正是
dropna
生成副本并将该副本分配给名称
item
。这有效地覆盖了名称
,该名称不再指向列表中的同一对象,而是代替了
dropna
生成的副本。通过使用
dropna
inplace=True
命令
dropna
不生成副本,而是更改所指向的对象谢谢你们两位的解释。
import pandas as pd
import numpy as np


a = pd.DataFrame()
ida = id(a)
a['one'] = [1, 2, 3, 4, 5]
a['two'] = np.nan

b = pd.DataFrame()
idb = id(a)
b['three'] = [1, 2, 3, 4, 5]
b['four'] = np.nan

lis = [a, b]
lis = [x.dropna(axis='columns',how='all', inplace=False) for x in lis]

from functools import reduce
c = reduce(lambda x, y: pd.merge(x, y, left_on= 'one', right_on='three', how='inner'), lis)