如何在Pandas DataFrame中提取列表列最大值并生成新列
提取Pandas列表列中的最大值创建新列
问题背景
现有如下Pandas DataFrame:
import pandas as pd import numpy as np d = {'Cell':['A','B','C','D','E'],'D1':[5, 2, 2, 6,6], 'D2':[np.nan, 5, 6, np.nan,3], 'D3':[7,np.nan, 5, 5,np.nan], 'D6':[17, 3, np.nan,np.nan,2],'diff%':[np.nan,[40],[16.67],[16.67,50],[50,33,24]]} df = pd.DataFrame(d)
原始数据:
| Cell | D1 | D2 | D3 | D6 | diff% | |
|---|---|---|---|---|---|---|
| 0 | A | 5 | NaN | 7.0 | 17.0 | NaN |
| 1 | B | 2 | 5.0 | NaN | 3.0 | [40] |
| 2 | C | 2 | 6.0 | 5.0 | NaN | [16.67] |
| 3 | D | 6 | NaN | 5.0 | NaN | [16.67, 50] |
| 4 | E | 6 | 3.0 | NaN | 2.0 | [50, 33, 24] |
需求:新增列max_diff%,提取diff%列(元素为列表或NaN)中的最大值,最终得到目标结果。
解决方案
方法一:apply结合自定义逻辑
直接遍历diff%列元素,判断是否为列表,是则取最大值,否则返回NaN:
df['max_diff%'] = df['diff%'].apply(lambda x: max(x) if isinstance(x, list) else np.nan)
逻辑直观,精准处理列表与NaN混合的列场景。
方法二:explode + groupby拆分分组
先将列表拆分为多行,再按原索引分组取最大值:
df['max_diff%'] = df['diff%'].explode().groupby(level=0).max()
explode把列表元素拆成单独行,groupby(level=0)按原索引分组聚合,自动保留NaN值。
两种方法均可得到符合预期的结果。
内容的提问来源于stack exchange,提问作者sandeep
相关产品推荐
相关产品推荐

