Python 根据条件从数据帧列表中删除数据帧

Python 根据条件从数据帧列表中删除数据帧,python,pandas,Python,Pandas,我有一个脚本,可以创建要连接的数据帧列表。在连接之前,我检查每个数据帧中的某一列是否存在“1”二进制标志。如果没有,我想从数据帧列表中删除数据帧。我遇到了问题,因为我不知道如何正确索引列表以删除数据帧。我用这段代码重新创建了问题 data = {'Name':['Tom', 'Tom', 'Tom', 'Tom'], 'Age':[20, 21, 19, 18]} data2 = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21,

我有一个脚本,可以创建要连接的数据帧列表。在连接之前,我检查每个数据帧中的某一列是否存在“1”二进制标志。如果没有,我想从数据帧列表中删除数据帧。我遇到了问题,因为我不知道如何正确索引列表以删除数据帧。我用这段代码重新创建了问题

data = {'Name':['Tom', 'Tom', 'Tom', 'Tom'], 'Age':[20, 21, 19, 18]} 
data2 = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21, 19, 18]} 

# Create DataFrame 
df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data)
df4 = pd.DataFrame(data2)

dflist = [df, df2, df3, df4]


for frame in dflist:
        vals = frame["Name"].values
        if 'krish' not in vals:
             dflist.remove(frame)
但是

我还尝试枚举列表并基于dflist[I]删除,但如果删除了某些内容,则会更改索引,因此随后将删除错误的帧


根据条件从df列表中删除数据帧的正确方法是什么?谢谢大家!

不要在迭代时从列表中删除项(这通常是一种不好的做法),而是使用列表理解生成一个包含感兴趣的数据帧的新列表:

[i for i in dflist if 'krish' not in i['Name'].values]

  Name  Age
 0  Tom   20
 1  Tom   21
 2  Tom   19
 3  Tom   18,   Name  Age
 0  Tom   20
 1  Tom   21
 2  Tom   19
 3  Tom   18]

如果数据帧非常大,以下是从原始列表中删除不需要的数据帧的安全方法:

ix = []
for i, frame in enumerate(dflist):
        vals = frame["Name"]
        if not vals.isin(['krish']).any():
             ix.append(i)

# sort the indices of dataframes to drop
# by starting from higher to lower indices you're guaranteed
# that the indices on the dataframe will remain unmodified while deleting
for i in sorted(ix, reverse=True):
    del dflist[i]

您应该使用
del
from
index
part,而不是使用
remove

l=[]
for index,frame in enumerate(dflist):
        vals = frame["Name"].values
        if 'krish' not in vals:
             l.append(index)
for x in sorted(l, reverse=True):
    del dflist[x]

我试过了,但是删除会改变列表的长度,所以索引也会改变。i、 e.如果dflist[1]被删除,第3帧现在是dflist[1]我在发布lol之前尝试了相同的代码,它删除了错误的帧,因为第一次删除后索引被更改。列表中的dataframe如何,内存不能容纳其中的两个。在这种情况下,要做的就是迭代列表并找到索引。我想@WeNYoBen会澄清这一点。是的,肯定更具pythonic/效率,如何使用它来删除数据帧?数据帧是否太大@johnny1995否则你只需创建新列表并删除
dflist
颠倒索引的顺序即可删除修复了我遇到的问题,我没想到!非常感谢。
l=[]
for index,frame in enumerate(dflist):
        vals = frame["Name"].values
        if 'krish' not in vals:
             l.append(index)
for x in sorted(l, reverse=True):
    del dflist[x]