根据条件从数据框列表中删除数据框

时间:2019-06-27 14:31:37

标签: python pandas

我有一个脚本,该脚本创建要连接的数据帧列表。串联之前,我正在检查每个数据帧中的某个列是否存在“ 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)

但是

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

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

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

2 个答案:

答案 0 :(得分:4)

通常不要使用迭代时从列表中删除项目的做法,而应使用列表推导来生成带有感兴趣数据帧的新列表:

[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]

如果数据帧很大,这是一种 safe 方法,可从原始列表中删除不需要的数据帧:

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]

答案 1 :(得分:2)

您应该使用del部分中的index而不是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]