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

如何在Pandas中将多列合并为一个列表类型的变量

解决方法:将DataFrame列合并为非空值列表

你的当前代码把每行的列拼接成了逗号分隔的字符串,但你需要的是列表类型的列,而且看起来需要过滤掉空值(从你的期望结果能看出来,有些行的部分列值没有被包含)。下面是具体的修正方案:

核心思路

我们需要在apply的lambda函数里做两件事:

  1. 过滤掉每行中的空值(包括NaN和空白字符串)
  2. 返回过滤后的结果作为列表,而不是拼接成字符串

修正后的代码

import pandas as pd

# 先模拟你的数据集(根据你的期望结果调整了空值位置)
data = {
    'Str1': ['OK', 'Yes', 'I see'],
    'Str2': ['I', 'Hm', None],
    'Str3': ['Go', None, 'Fine']
}
df_manual_label = pd.DataFrame(data)

# 生成AllStr列
df_manual_label['AllStr'] = df_manual_label[['Str1', 'Str2', 'Str3']].apply(
    lambda x: [s for s in x if pd.notna(s) and s.strip() != ''],
    axis=1
)

# 查看结果
print(df_manual_label['AllStr'])

运行结果

执行后会得到你想要的列表格式:

0    [OK, I, Go]
1      [Yes, Hm]
2    [I see, Fine]
Name: AllStr, dtype: object

额外需求:转小写

如果需要把所有字符串转成小写(比如你期望结果里的"ok"),只需要修改lambda函数,加上.lower()即可:

df_manual_label['AllStr'] = df_manual_label[['Str1', 'Str2', 'Str3']].apply(
    lambda x: [s.strip().lower() for s in x if pd.notna(s) and s.strip() != ''],
    axis=1
)

此时输出会变成:

0    [ok, i, go]
1      [yes, hm]
2    [i see, fine]
Name: AllStr, dtype: object

为什么你的原代码不符合预期?

你用了', '.join(x.astype(str)),这个操作会把每行的所有列(包括空值转成的'nan'字符串)拼接成一个单一的字符串,而不是返回列表类型。我们的修改直接返回过滤后的列表,同时排除了无效的空值内容,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:36:54