python pandas 整数到二进制的csv文件转换

python pandas csv file conversion of integers to binary

我有一个这样的 csv 文件

Meme1, Meme2, Meme3, Meme4, Meme5, Meme6
Meme1, Meme2, Meme3, Meme99, Meme5, Meme6
Meme5, Meme2, Meme2, Meme4, Meme10, Meme6
Meme99, Meme3, Meme4, Meme4, Meme5, Meme6

我想要那样

00000001, 00000010, 00000011, 00000100, 00000101, 00000110
00000001, 00000010, 01100011, 00000100, 00000101, 00000110
00000100, 00000010, 00000010, 00000100, 00001010, 00000110

表示每个整数都应转换为二进制,并且应删除单词模因

I am trying but cannot do:(
import pandas as pd
import csv
import numpy as np

dataset = pd.read_csv('datsetcoma.txt')
reader = csv.DictReader(dataset)
print (reader)
 # print back the headers
for row in reader:
    if row.is_integer:
      
       b=np.binary_repr(10, width=8)
       print (b)

使用 import io 加载 DF 而没有 headers,我使用正则表达式提取整数而不扩展。然后转换为整数类型。因为 np.binary_repr 没有矢量化,所以我必须对其进行“矢量化”。

因为 np 方法不保留索引,然后我在 pd.Series 中重现索引(需要保留 multi-index 中保留的行和列位置)构造函数并展开回原始数据框形状。

df = pd.read_csv(io.StringIO('''Meme1, Meme2, Meme3, Meme4, Meme5, Meme6
Meme1, Meme2, Meme3, Meme99, Meme5, Meme6
Meme5, Meme2, Meme2, Meme4, Meme10, Meme6
Meme99, Meme3, Meme4, Meme4, Meme5, Meme6'''), header=None)

s = df.stack()
s = s.str.extract(r'(\d+)', expand=False).astype(int)
pd.Series(np.vectorize(np.binary_repr)(s, width=8), index=s.index).unstack()

最终输出,

          0         1         2         3         4         5
0  00000001  00000010  00000011  00000100  00000101  00000110
1  00000001  00000010  00000011  01100011  00000101  00000110
2  00000101  00000010  00000010  00000100  00001010  00000110
3  01100011  00000011  00000100  00000100  00000101  00000110

Nb 您在原始 post 中的二进制转换并不都是准确的。例如,Meme5 被错误地转换为 00000100,而它应该是 00000101。 OP 版本还省略了(可能是为了方便)最后一行。

注意,如果有多个扩展组,这将不起作用。在评论中,我提出了假设的例子 foo123bar456。这将导致两个会干扰索引的扩展组。

你也可以试试这个:

import pandas as pd
import numpy as np
import io

# example taken from @ifly6  
df = pd.read_csv(io.StringIO('''Meme1, Meme2, Meme3, Meme4, Meme5, Meme6
Meme1, Meme2, Meme3, Meme99, Meme5, Meme6
Meme5, Meme2, Meme2, Meme4, Meme10, Meme6
Meme99, Meme3, Meme4, Meme4, Meme5, Meme6'''), header=None)

df.apply(lambda x: x.apply(lambda y:  bin(int(y.replace('Meme', '')))[2:].zfill(8) ) ) 

#output

          0         1         2         3         4         5
0  00000001  00000010  00000011  00000100  00000101  00000110
1  00000001  00000010  00000011  01100011  00000101  00000110
2  00000101  00000010  00000010  00000100  00001010  00000110
3  01100011  00000011  00000100  00000100  00000101  00000110