Python:将DataFrame按json_list列的列表长度拆分为两个独立DataFrame
Pythonic方式拆分DataFrame
当然有非常Pythonic的实现方式!我们可以借助pandas的向量化操作和布尔索引轻松完成这个拆分需求,代码简洁高效,完全符合Python的风格。
步骤说明
- 构造示例DataFrame(还原你给出的测试数据)
- 生成布尔掩码:判断每行
json_list列的列表长度 - 布尔索引筛选:用掩码拆分出目标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
相关产品推荐
相关产品推荐

