如何在Python中用循环生成随机字符串并存入DataFrame列(不使用append)
解决生成N个安全随机字符串并存储到DataFrame的问题
原单个字符串生成代码
原本可成功生成单个安全随机字母数字字符串的代码:
import random import string import secrets num = 10 res = ''.join(secrets.choice(string.ascii_uppercase+ string.digits) for x in range(num)) print("Secure random string is :"+ str(res))
输出示例:Secure random string is :W8W602HOMJ
错误尝试及报错
尝试生成N个字符串并存储到DataFrame时出现两种错误:
第一种写法及报错
import random import string import secrets num = 10 # define the length of the string N=10 for i in range (1,N): res = ''.join(secrets.choice(string.ascii_uppercase+ string.digits) for x in range(num)) df3.append(res) print(df3)
报错信息:
Error : append is being Deprecated use pd.concat and 'Str' cant be appended to Dataframe.
第二种写法及报错
for i in range (1,N): res = ''.join(secrets.choice(string.ascii_uppercase+ string.digits) for x in range(num)) df3 = pd.concat(df3,res) print(df3)
报错信息:
Error : FutureWarning: In a future version of pandas all arguments of concat except for the argument 'objs' will be keyword-only.
错误原因分析
- 第一种写法错误:
- 已弃用的
append方法仅接受DataFrame或Series类型,无法直接追加单个字符串;且未初始化df3就调用方法,会导致未定义错误。
- 已弃用的
- 第二种写法错误:
pd.concat的第一个参数objs必须是包含DataFrame/Series的可迭代对象(如列表),不能直接传入df3和字符串res;同时res不是合法的合并对象类型。
正确解决方案
方案1:先收集所有字符串到列表(推荐,效率更高)
一次性生成所有随机字符串存入列表,再转换为DataFrame,避免循环中频繁操作DataFrame:
import string import secrets import pandas as pd num = 10 # 单个字符串的长度 N = 10 # 需要生成的字符串个数 # 生成N个随机字符串的列表 random_strings = [ ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(num)) for _ in range(N) ] # 将列表转换为DataFrame df3 = pd.DataFrame(random_strings, columns=['random_string']) print(df3)
方案2:循环中使用pd.concat(不推荐,效率较低)
如果必须用循环,需将每次生成的字符串转为Series,再通过pd.concat合并到DataFrame:
import string import secrets import pandas as pd num = 10 N = 10 # 初始化空的DataFrame,指定列名 df3 = pd.DataFrame(columns=['random_string']) for _ in range(N): res = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(num)) # 将单个字符串转为Series,指定列名后合并 new_row = pd.Series([res], name='random_string') df3 = pd.concat([df3, new_row.to_frame()], ignore_index=True) print(df3)
内容的提问来源于stack exchange,提问作者sandeep reddy
相关产品推荐
相关产品推荐

