如何在Python中为数值型DataFrame生成bigram与trigram
在整数型DataFrame上生成Bigram和Trigram
问题描述
我需要在整数型的n×m DataFrame上生成二元组(Bigram)和三元组(Trigram),示例DataFrame如下:
1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15
尝试了一段代码但无法正常运行:
for i in range(df.shape[0]): row = list(str(df.iloc[i,:])) print("row: ", row) bigrams = [b for l in row for b in zip(l.split(" ")[:-1], l.split(" ")[1:])] print(bigrams)
期望输出示例(以一维列表[10,20,30,40,50,60,...]为例):
- Bigram:
(10,20)(20,30)(30,40)(40,50)... - Trigram:
(10,20,30)(20,30,40)(30,40,50)...
错误原因
之前的代码错误地将整行数据转为字符串再拆分,导致把数字拆成了单个字符(比如10变成['1','0']),完全偏离了处理数值序列的需求。
解决方案
1. 构造示例DataFrame
import pandas as pd df = pd.DataFrame([ [1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15] ])
2. 生成每行的Bigram
直接提取行的数值列表,通过zip将列表与自身偏移一位的列表配对,得到连续二元组:
# 遍历每行生成Bigram for idx, row in df.iterrows(): row_vals = row.tolist() bigrams = list(zip(row_vals, row_vals[1:])) print(f"第{idx+1}行Bigram: {bigrams}")
输出结果:
第1行Bigram: [(1, 2), (2, 3), (3, 4), (4, 5)] 第2行Bigram: [(6, 7), (7, 8), (8, 9), (9, 10)] 第3行Bigram: [(11, 12), (12, 13), (13, 14), (14, 15)]
3. 生成每行的Trigram
同理,通过zip将列表与自身偏移一位、偏移两位的列表配对,得到连续三元组:
# 遍历每行生成Trigram for idx, row in df.iterrows(): row_vals = row.tolist() trigrams = list(zip(row_vals, row_vals[1:], row_vals[2:])) print(f"第{idx+1}行Trigram: {trigrams}")
输出结果:
第1行Trigram: [(1, 2, 3), (2, 3, 4), (3, 4, 5)] 第2行Trigram: [(6, 7, 8), (7, 8, 9), (8, 9, 10)] 第3行Trigram: [(11, 12, 13), (12, 13, 14), (13, 14, 15)]
4. 一维列表的处理方式
如果是一维数值列表(如[10,20,30,40,50,60]),处理逻辑更简洁:
data = [10,20,30,40,50,60] # 生成Bigram bigrams = list(zip(data, data[1:])) # 生成Trigram trigrams = list(zip(data, data[1:], data[2:])) print("Bigram:", bigrams) print("Trigram:", trigrams)
输出结果:
Bigram: [(10, 20), (20, 30), (30, 40), (40, 50), (50, 60)] Trigram: [(10, 20, 30), (20, 30, 40), (30, 40, 50), (40, 50, 60)]
内容的提问来源于stack exchange,提问作者Mohsen Ali
相关产品推荐
相关产品推荐

