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

Python:将DataFrame按json_list列的列表长度拆分为两个独立DataFrame

Pythonic方式拆分DataFrame

当然有非常Pythonic的实现方式!我们可以借助pandas的向量化操作和布尔索引轻松完成这个拆分需求,代码简洁高效,完全符合Python的风格。

步骤说明

  1. 构造示例DataFrame(还原你给出的测试数据)
  2. 生成布尔掩码:判断每行json_list列的列表长度
  3. 布尔索引筛选:用掩码拆分出目标DataFrame

完整代码示例

import pandas as pd

# 构造你提供的示例DataFrame
data = {
    'symbol': ['A', 'B', 'C'],
    'json_list': [
        [{'name': 'S&P500', 'perc':25, 'ticker':'SPY', 'weight':1}],
        [{'name': 'S&P500', 'perc':25, 'ticker':'SPY', 'weight':0.5}, {'name': 'NASDAQ', 'perc':75, 'ticker':'QQQ', 'weight':0.5}],
        [{'name': 'S&P500', 'perc':25, 'ticker':'SPY', 'weight':1}]
    ],
    'date': ['2022-01-01', '2022-01-02', '2022-01-02']
}
df = pd.DataFrame(data)

# 生成布尔掩码:标记json_list长度为1的行
mask_single = df['json_list'].str.len() == 1

# 拆分DataFrame,同时重置索引让结果更整洁
df1 = df[mask_single].reset_index(drop=True)
df2 = df[~mask_single].reset_index(drop=True)

代码解释

  • df['json_list'].str.len():pandas提供的向量化方法,直接对列表类型的列计算每个元素的长度,比手动循环遍历高效得多,这是pandas最推荐的操作方式。
  • 布尔索引:用mask_single筛选出长度为1的行,~mask_single取反筛选出长度≥2的行,语法简洁直观。
  • reset_index(drop=True):重置拆分后DataFrame的索引,避免保留原DataFrame的索引值,让结果更符合预期。

备选方案(处理特殊情况)

如果你的json_list列中可能存在非列表类型的元素(比如None),可以改用apply(len)来兼容:

mask_single = df['json_list'].apply(len) == 1

输出结果

打印df1会得到:

symbol                                           json_list        date
0      A  [{'name': 'S&P500', 'perc': 25, 'ticker': 'SPY'...  2022-01-01
1      C  [{'name': 'S&P500', 'perc': 25, 'ticker': 'SPY'...  2022-01-02

打印df2会得到:

symbol                                           json_list        date
0      B  [{'name': 'S&P500', 'perc': 25, 'ticker': 'SPY'...  2022-01-02

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:17:39