如何从DataFrame含列表的列中生成符合指定规则的新列
解决DataFrame列表列拆分问题
我来帮你搞定这个需求!针对你的DataFrame中存储列表的Others列,我们可以通过自定义逻辑处理每个列表的长度,来精准生成Surname、Age和Weight这三个新列。
步骤1:先构造示例DataFrame(方便验证)
首先我们先还原你的输入数据:
import pandas as pd data = { 'First_Name': ['Ken', 'Cole', 'Eddie'], 'Others': [["Batman","28","5.5"], ["36","6.1"], ["24"]] } df = pd.DataFrame(data)
步骤2:定义拆分逻辑并生成新列
我们可以用列表推导式结合pd.DataFrame来高效处理,这种方式比apply函数性能更优,适合大数据量场景:
# 遍历每个列表,根据长度分配对应值 new_columns = pd.DataFrame( [ # 列表长度为3时:Surname=第1个元素,Age=第2个,Weight=第3个 (lst[0], lst[1], lst[2]) if len(lst) == 3 else # 列表长度为2时:Surname空,Age=第1个,Weight=第2个 (pd.NA, lst[0], lst[1]) if len(lst) == 2 else # 列表长度为1时:Surname空,Age=第1个,Weight空 (pd.NA, lst[0], pd.NA) if len(lst) == 1 else # 其他长度(比如空列表):全部空值 (pd.NA, pd.NA, pd.NA) for lst in df['Others'] ], index=df.index, columns=['Surname', 'Age', 'Weight'] ) # 将新列合并到原DataFrame df = pd.concat([df, new_columns], axis=1)
验证结果
运行后你会得到符合预期的输出:
| First_Name | Others | Surname | Age | Weight |
|---|---|---|---|---|
| Ken | ["Batman","28","5.5"] | Batman | 28 | 5.5 |
| Cole | ["36","6.1"] | 36 | 6.1 | |
| Eddie | ["24"] | 24 |
(注:你示例中的数值变化应该是笔误,代码会严格按照列表中的原始值填充;如果需要转换数值格式,可以在逻辑里加上float()或int()处理,比如int(lst[1]))
另一种直观方式:用apply函数
如果你觉得列表推导式不够直观,也可以用apply结合自定义函数实现:
def process_others(row): lst = row['Others'] if len(lst) == 3: return pd.Series([lst[0], lst[1], lst[2]], index=['Surname', 'Age', 'Weight']) elif len(lst) == 2: return pd.Series([pd.NA, lst[0], lst[1]], index=['Surname', 'Age', 'Weight']) elif len(lst) == 1: return pd.Series([pd.NA, lst[0], pd.NA], index=['Surname', 'Age', 'Weight']) else: return pd.Series([pd.NA, pd.NA, pd.NA], index=['Surname', 'Age', 'Weight']) df[['Surname', 'Age', 'Weight']] = df.apply(process_others, axis=1)
两种方式都能满足你的需求,按需选择即可。
内容的提问来源于stack exchange,提问作者frankfrank-o
相关产品推荐
相关产品推荐

