Python 如何将CSV列转换为Vowpal Wabbit txt输入文件

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.

我正在尝试将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.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。