You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark:如何处理DataFrame嵌套列表列并过滤指定值行

解决方法:过滤DataFrame中嵌套列表包含指定首元素的行

我来帮你搞定这个需求!针对你的场景——从JSON加载的DataFrame,其中cards字段是嵌套列表,要筛选出所有cards里存在子列表首元素等于指定值的行,这里有两种实用的方法:

方法1:使用apply结合lambda函数(简洁直观)

这种方法适合数据量不大的场景,直接对cards列的每个元素做检查:

import pandas as pd

# 先加载你的JSON数据到DataFrame(示例用你给的行构造)
data = [
    {"id": "D1", "class": "WARRIOR", "archetype": "Pirate Warrior", "matches": 140000, "duration": 6.2, "turns": 7.5, "winrate": 58.0, "cards": [["DRG_024", 2], ["CS2_146", 1], ["EX1_409", 1]]},
    {"id": "D2", "class": "MAGE", "archetype": "Arcane Mage", "matches": 80000, "duration": 8.1, "turns": 10.2, "winrate": 52.0, "cards": [["DRG_001", 2], ["EX1_279", 2]]},
    {"id": "D3", "class": "WARRIOR", "archetype": "Control Warrior", "matches": 60000, "duration": 12.5, "turns": 15.3, "winrate": 55.0, "cards": [["CS2_146", 2], ["EX1_620", 1]]}
]
df = pd.DataFrame(data)

# 指定要匹配的目标值
target_card = "CS2_146"

# 过滤行:检查cards列表中是否有子列表的第一个元素等于target_card
filtered_df = df[df['cards'].apply(lambda x: any(item[0] == target_card for item in x))]

print(filtered_df)

运行后会得到id为D1和D3的行,正好符合你的需求。如果担心有些子列表可能长度不足(比如空列表),可以把判断条件改成更健壮的版本:

filtered_df = df[df['cards'].apply(lambda x: any(len(item) >= 1 and item[0] == target_card for item in x))]

方法2:使用explode展开列表(大数据更高效)

如果你的DataFrame行数很多,apply的效率可能不够,这时候可以用explode把嵌套列表展开,过滤后再合并回去:

target_card = "CS2_146"

# 展开cards列,把每个子列表变成单独的行
exploded_df = df.explode('cards')

# 提取每个子列表的第一个元素,过滤出匹配的行,然后获取唯一的id
matching_ids = exploded_df[exploded_df['cards'].str[0] == target_card]['id'].unique()

# 用这些id筛选原DataFrame
filtered_df = df[df['id'].isin(matching_ids)]

print(filtered_df)

这种方法利用pandas的向量化操作,处理大规模数据时性能会更好。

内容的提问来源于stack exchange,提问作者StormPooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:13:13