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

如何用Pandas DataFrame两列值生成拼接字符串列表?

Pandas两列值拼接生成字符串列表的问题解决

需求说明

现有如下DataFrame:

import pandas as pd

df = pd.DataFrame(data=[["a",1],["b",2],["c",3]], columns=["id1","id2"])

需要生成列表 new_ids=['a_1','b_2','c_3'],即每行id1与id2的值用下划线拼接。

错误代码分析

版本一:生成独立列表后合并失败

# 此函数可正常运行
def get_ids(orig_df):
    id1_list=[]
    id2_list=[]

    for i in range(len(orig_df)):
        id1_list.append(orig_df['id1'].values[i])
        id2_list.append(orig_df['id2'].values[i])
    return(id1_list,id2_list)    

idlist1,idlist2=get_ids(df)    

# 以下部分无法运行
new_id=[]
for i,j in zip(idlist1,idlist2):
   row='_'.join(str(idlist1[i]),str(idlist2[j]))
   new_id.append(row)

错误原因:zip(idlist1, idlist2)返回的i和j是列表中的元素(如i='a'、j=1),但代码中用idlist1[i]试图用字符串作为列表索引,触发TypeError: list indices must be integers or slices, not str。

版本二:直接遍历DataFrame失败

newid_list=[]
for i in range(len(df)):
    n1=df['id1'[i].values]
    n2=df['id2'[i].values]
    nid= str(n1)+"_"+str(n2)
    newid_list.append(nid)

错误原因:语法错误,df['id1'[i].values]的括号位置错误,实际是先取字符串'id1'的第i个字符(如i=0时取'i'),再调用.values,而字符串没有values属性,触发AttributeError: 'str' object has no attribute 'values'。

正确解法

方法1:Pandas原生高效写法(推荐)

利用Pandas的向量运算直接拼接,无需循环,适合大数据量:

# 将id2转为字符串后与id1拼接,再转成列表
new_ids = (df['id1'] + '_' + df['id2'].astype(str)).tolist()
print(new_ids)  # 输出: ['a_1', 'b_2', 'c_3']

方法2:修复版本一的循环写法

直接使用zip返回的元素,无需再通过列表索引:

idlist1, idlist2 = get_ids(df)
new_id = []
for i, j in zip(idlist1, idlist2):
    # 用f-string拼接更简洁,也可使用'_'.join([str(i), str(j)])
    row = f"{i}_{j}"
    new_id.append(row)
print(new_id)  # 输出: ['a_1', 'b_2', 'c_3']

方法3:修复版本二的遍历写法

修正语法错误,正确获取每行的列值:

newid_list = []
for i in range(len(df)):
    n1 = df['id1'].values[i]
    n2 = df['id2'].values[i]
    nid = f"{n1}_{n2}"
    newid_list.append(nid)
print(newid_list)  # 输出: ['a_1', 'b_2', 'c_3']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:19:47