基于条件从数据框列表中删除数据框

4
我有一个脚本,用于创建要连接的数据帧列表。在连接之前,我会检查每个数据帧中的某一列是否存在“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个回答

8

不要在迭代过程中删除列表中的项目,因为这通常是一种不好的做法,而是使用列表推导式生成一个新列表,包含感兴趣的数据框:

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

1
数据框在列表中很大,内存无法容纳其中的两个,这该怎么办? - BENY
在这种情况下,我猜遍历列表并找到索引应该是解决问题的正确方法。不过,无论如何 @WeNYoBen 都会澄清的。 - yatu
肯定更加Pythonic/高效,那么这个怎么用来删除数据框呢? - johnny1995
1
数据框太大了吗?@johnny1995否则你可以创建新列表并删除'dflist'。 - yatu
1
将索引顺序反转以删除固定的问题,这解决了我遇到的问题,我没有想到!谢谢! - johnny1995
另外,你先列出转换的输出是相反的 :-) 也为你投票 - BENY

2
你应该使用delindex部分删除元素,而不是使用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]

我尝试过那样做,但是删除操作会改变列表的长度,因此索引也会随之改变。例如,如果删除dflist[1],那么原来的frame 3现在就变成了dflist[1]。 - johnny1995
我在发布之前尝试了那段完全相同的代码,但它会删除错误的帧,因为在第一次删除后索引已被更改。 - johnny1995

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接