如何在Pandas中将多列合并为一个列表类型的变量
解决方法:将DataFrame列合并为非空值列表
你的当前代码把每行的列拼接成了逗号分隔的字符串,但你需要的是列表类型的列,而且看起来需要过滤掉空值(从你的期望结果能看出来,有些行的部分列值没有被包含)。下面是具体的修正方案:
核心思路
我们需要在apply的lambda函数里做两件事:
- 过滤掉每行中的空值(包括
NaN和空白字符串) - 返回过滤后的结果作为列表,而不是拼接成字符串
修正后的代码
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
相关产品推荐
相关产品推荐

