python - 根据条件从数据框列表中删除数据框
问题描述
我有一个脚本可以创建要连接的数据框列表。在连接之前,我正在检查每个数据帧中的某个列是否存在“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 列表中删除数据帧的正确方法是什么?谢谢!
解决方案
不要在迭代时从列表中删除项目,这通常是一种不好的做法,而是使用列表推导生成一个包含感兴趣数据帧的新列表:
[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]
推荐阅读
- php - php mysql fetch 数组重复索引问题
- c# - 如何比较两个列表
- python - 如何逐行读取文件并根据使用的分隔符从每一行选择性地打印文本
- wordpress - Gatsby Wordpress ACF 图像字段返回“null”
- c# - 如何管理 systemoutofmemory 异常?
- c# - 如何从引用的 nuget 包中加载 azure 活动函数
- amazon-web-services - 域未指向我在 aws lightsail 中的静态 IP 地址
- java - 将检索到的浮点值从外部文件转换为浮点数组。使其与方法匹配
- postgresql - PostgreSQL:通过未索引的列或其他表删除更快的是什么?
- java - 如何使用 Angular 调用基于 SAML(http-post 绑定)的 REST API?