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
相关产品推荐
相关产品推荐

