Python 如何将CSV列转换为Vowpal Wabbit txt输入文件
我正在尝试将csv(10列)转换为vowpal wabbit输入格式txt文件。有些csv列具有整数值,有些具有字符串(如:com.12346.xyz)。例如,如果我的csv列如下所示:Python 如何将CSV列转换为Vowpal Wabbit txt输入文件,python,vowpalwabbit,Python,Vowpalwabbit,我正在尝试将csv(10列)转换为vowpal wabbit输入格式txt文件。有些csv列具有整数值,有些具有字符串(如:com.12346.xyz)。例如,如果我的csv列如下所示: loss weight SSD_id weight label imp feat_val 0.693147 0.693147 1 1.0 -1.0000 0.0000 com.
loss weight SSD_id weight label imp feat_val
0.693147 0.693147 1 1.0 -1.0000 0.0000 com.12346.xyz
0.419189 0.145231 2 2.0 1.0000 -1.8559 com.12346.xyz
0.235457 0.051725 4 4.0 -1.0000 -2.7588 com.12356.xyz
6.371911 12.508365 8 8.0 -1.0000 -3.7784 com.12346.xyz
3.485084 0.598258 16 16.0 1.0000 -2.2767 com.12346.xyz
1.765249 0.045413 32 32.0 -1.0000 -2.8924 com.1236.xyz
1.017911 0.270573 64 64.0 -1.0000 -3.0438 com.12236.xyz
0.611419 0.204927 128 128.0 1.0000 -3.1539 com.16746.xyz
0.469127 0.326834 256 256.0 -1.0000 -1.6101 com.1946.xyz
0.403473 0.337820 512 512.0 1.0000 -2.8843 com.126.xyz
0.337348 0.271222 1024 1024.0 -1.0000 -2.5209 com.1346.xyz
0.328909 0.320471 2048 2048.0 1.0000 -2.0732 com.1234.xyz
0.309401 0.289892 4096 4096.0 1.0000 -2.7639 com.12396.xyz
label weight |i imp SSD_id loss |c feat_val
vowpal wabbit输入格式如下所示:
loss weight SSD_id weight label imp feat_val
0.693147 0.693147 1 1.0 -1.0000 0.0000 com.12346.xyz
0.419189 0.145231 2 2.0 1.0000 -1.8559 com.12346.xyz
0.235457 0.051725 4 4.0 -1.0000 -2.7588 com.12356.xyz
6.371911 12.508365 8 8.0 -1.0000 -3.7784 com.12346.xyz
3.485084 0.598258 16 16.0 1.0000 -2.2767 com.12346.xyz
1.765249 0.045413 32 32.0 -1.0000 -2.8924 com.1236.xyz
1.017911 0.270573 64 64.0 -1.0000 -3.0438 com.12236.xyz
0.611419 0.204927 128 128.0 1.0000 -3.1539 com.16746.xyz
0.469127 0.326834 256 256.0 -1.0000 -1.6101 com.1946.xyz
0.403473 0.337820 512 512.0 1.0000 -2.8843 com.126.xyz
0.337348 0.271222 1024 1024.0 -1.0000 -2.5209 com.1346.xyz
0.328909 0.320471 2048 2048.0 1.0000 -2.0732 com.1234.xyz
0.309401 0.289892 4096 4096.0 1.0000 -2.7639 com.12396.xyz
label weight |i imp SSD_id loss |c feat_val
在vowpal wabbit txt文件中,值应为:
-1 0.051725 |i imp:-2.7588 SSD_id:4 loss:0.235457 |c feat_val=com.12356.xyz
1 0.598258 |i imp:-2.7588 SSD_id:4 loss:3.485034 |c feat_val=com.12346.xyz
。。。等等对于所有行值。我有大量的行在csv文件中,我想转换成上述格式,并保存在一个txt文件中的所有。我从下面给出的这个小函数开始:
def to_new_format(document, label=None):
return str(label or '') + ' |i ' + ' '.join(re.findall('\w{3,}', document.lower())) + '\n'
to_new_format(str(text_train[1])
但我现在完全迷路了,在多次尝试数据帧、csv格式和尝试函数之后。有人能告诉我如何用最少的代码行来实现这一点吗?这比看起来更简单,因为Pandas有一些简便的方法,可以让你像对待Python中的单个值一样对待序列 首先,我们将导入您的CSV文件,将所有值视为字符串,以简化格式设置:
将熊猫作为pd导入
df=pd.read\u csv('test\u data.txt',dtype=pd.StringDtype())
您的标签
列会像1.0000
一样记录在您的文件中,但您不希望在输出中使用十进制或零。我们可以用熊猫的方法解决这个问题
df.label=df.label.str.replace('.0000','',regex=False)
这里有一个神奇的部分:我们可以像连接单个字符串一样连接这些字符串
格式化=(
df.标签+“”+df.重量+
“| i imp:”+df.imp+
“SSD_id:”+df.SSD_id+
“损失:”+df.loss+
|c feat_val='+df.feat_val+
“\n”
)
该代码看起来会创建一个字符串,但由于它如何包含数据帧的列(每个列都是一个序列),因此结果也是一个序列:
打印(格式化)
0-1 0.693147 | i imp:0.0000 SSD|U id:1损失:0.693。。。
1 0.145231 | i imp:-1.8559 SSD|U id:2损失:0.419。。。
2-1 0.051725 | i imp:-2.7588 SSD|U id:4损失:0.23。。。
3-1 12.508365 | i imp:-3.7784 SSD|U id:8损失:6.3。。。
4 1 0.598258 | i imp:-2.2767 SSD|U id:16损失:3.48。。。
5-1 0.045413 | i imp:-2.8924 SSD|U id:32损失:1.7。。。
6-1 0.270573 | i imp:-3.0438 SSD|U id:64损失:1.0。。。
7 1 0.204927 | i imp:-3.1539 SSD|U id:128损失:0.6。。。
8-1 0.326834 | i imp:-1.6101 SSD_id:256损失:0。。。。
9 1 0.337820 | i imp:-2.8843 SSD|U id:512损失:0.4。。。
10-1 0.271222 | i imp:-2.5209 SSD|U id:1024损失:0。。。
11 1 0.320471 | i imp:-2.0732 SSD|U id:2048损失:0。。。。
12 1 0.289892 | i imp:-2.7639 SSD|U id:4096损失:0。。。。
像这样打印时,每行都会被截断,但都在那里。例如:
打印(格式化[0])
-1 0.693147 | i imp:0.0000 SSD|u id:1损失:0.693147 | c feat|u val=com.12346.xyz
只需将其保存到文件:
以open('out.txt','w')作为f的:
f、 写线(格式化)
您的解决方案非常干净、出色且易于理解。我学到了一些新东西。我已经试了一个星期了。是的,你是对的,它看起来很复杂,但如果以正确的方式实现,它很简单。如果数据是json格式的,这仍然有效吗?很高兴它有帮助!老实说,我现在也在学习熊猫,回答这个问题对我来说很有教育意义。碰巧熊猫也有办法!您可能需要根据文件的格式进行调整,但是是的,这种方法应该仍然有效。在发送请求时,数据基本上是json格式的,但对于我来说,这太复杂了,无法找到解决方案,所以我想先尝试使用csv。是的,您的解决方案方法与我尝试使用csv所做的完全一样,现在将尝试使用json。