
在数据分析和机器学习项目中,经常需要生成虚拟数据(dummy data)来测试代码、模拟场景或进行原型开发。当需要的数据集包含数值型和文本(分类)型字段时,如何高效且正确地生成这些混合类型的数据是一个常见的需求。本文将详细阐述如何利用pandas和numpy库,结合python的random模块,创建包含多列数值和随机文本数据的dataframe,并提供最佳实践。
在尝试为DataFrame生成随机文本列时,一个常见的错误是未能为每一行独立生成一个随机值,而是生成了一个单一的随机值并将其广播到整个列。例如,如果有一个字符串列表WORDS = ["A", "B", "C"],并尝试使用"Column": random.randrange(len(word))或"Column": random.choice(word)(其中word是random.choice(WORDS)的结果,即一个单一的字符串)来填充列,结果将是整个列都填充了相同的随机索引或单一字符串的字符。
正确的做法是为DataFrame的每一行独立地从预定义的文本列表中选择一个随机值,从而确保整个列充满了不同的随机文本条目。
对于数值型数据,NumPy库提供了强大的工具。np.random.randint函数可以方便地生成指定范围内的整数数组。
例如,要生成50,000行介于75到325之间的随机整数作为“Sq. feet”列,以及介于200,000到1,250,000之间的随机整数作为“Price”列,可以这样做:
import numpy as np import pandas as pd SIZE = 50000 # 定义数据行数 # 设置随机种子以保证结果可复现 np.random.seed(1) sq_feet_data = np.random.randint(low=75, high=325, size=SIZE) price_data = np.random.randint(low=200000, high=1250000, size=SIZE)
生成随机文本列的关键在于使用列表推导式结合random.choice()函数。random.choice()函数用于从一个非空序列中随机选择一个元素。通过列表推导式,我们可以重复这个操作SIZE次,从而生成一个包含SIZE个随机文本元素的列表。
假设我们有一个包含不同行政区名称的列表:
import random BOROUGHS = ["Chelsea", "Kensington", "Westminster", "Pimlico", "Bank", "Holborn", "Camden", "Islington", "Angel", "Battersea", "Knightsbridge", "Bermondsey", "Newham"] # 使用列表推导式生成随机行政区列表 borough_data = [random.choice(BOROUGHS) for _ in range(SIZE)]
这里的_是一个占位符变量,表示我们不需要在循环中使用每次迭代的索引值。
将生成的数值和文本数据整合到一个Pandas DataFrame中:
# 完整的代码示例
import random
import pandas as pd
import numpy as np
# 定义数据行数,建议使用大写变量名表示常量
SIZE = 50_000
# 定义行政区列表,建议使用大写变量名表示常量
BOROUGHS = ["Chelsea", "Kensington", "Westminster", "Pimlico", "Bank", "Holborn", "Camden", "Islington", "Angel", "Battersea", "Knightsbridge", "Bermondsey", "Newham"]
# 设置NumPy的随机种子以保证数值数据可复现
np.random.seed(1)
# 创建DataFrame
data = pd.DataFrame({
"Sq. feet": np.random.randint(low=75, high=325, size=SIZE),
"Price": np.random.randint(low=200000, high=1250000, size=SIZE),
"Borough": [random.choice(BOROUGHS) for _ in range(SIZE)] # 使用列表推导式生成随机文本列
})
# 打印前几行数据以验证
print(data.head())
# 将DataFrame保存为CSV文件
# index=False 避免将DataFrame的索引写入CSV文件
data.to_csv("realestate.csv", index=False)
print("\n数据已成功生成并保存到 realestate.csv")示例输出:
Sq. feet Price Borough 0 112 345382 Pimlico 1 310 901500 Battersea 2 215 661033 Holborn 3 147 1038431 Westminster 4 212 296497 Holborn
可以看到,“Borough”列现在包含了来自BOROUGHS列表的随机行政区名称,而不是单一的重复值。
通过结合使用NumPy生成数值数据和Python的random.choice函数配合列表推导式生成文本数据,可以高效且准确地创建包含混合数据类型的虚拟DataFrame。遵循良好的编程实践,如使用常量、清晰命名和设置随机种子,将进一步提升代码的质量和可维护性。掌握这些技巧,将使您在数据准备和项目测试阶段更加得心应手。
以上就是使用Pandas生成混合类型虚拟数据:数值与文本列的正确实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号