我有一个Pandas 数据帧,它由一个ID和不同编码单词的相关计数组成.例如:

Original = pd.DataFrame(data=[[1,'1:2,2:3,3:1'],[2,'2:2,4:3']], columns=['id','words'])

我有一个词典,它有到实际单词的映射,例如:

WordDict = {1:'A',2:'B',3:'C',4:'D'}

我想要做的是创建一个新的数据帧,它将计数映射到所有可能单词的列,因此它看起来如下所示:

Final =pd.DataFrame(data=[[1,2,3,1,0],[2,0,2,0,3]], columns=['id','A','B','C','D']).set_index('id')

我知道我可以将原始文档的"Words"列拆分成多个单独的列,并且可以从WordDict创建一个数据帧,这样它就可以包含所有可能的列,但我不知道如何创建映射.

推荐答案

您可以使用正则表达式、列表理解和DataFrame构造函数:

import re

Final = pd.DataFrame([{WordDict.get(int(k), None): v
                      for k,v in re.findall('([^:,]+):([^:,]+)', s)}
                      for s in Original['words']], index=Original['id']
                     ).fillna(0).astype(int)

或使用split:

Final = pd.DataFrame([{WordDict.get(int(k), None): v
                       for x in s.split(',')
                       for k,v in [x.split(':')]}
                      for s in Original['words']], index=Original['id']
                     ).fillna(0).astype(int)

ast.literal_eval:

from ast import literal_eval

Final = pd.DataFrame([{WordDict.get(k, None): v for k,v in literal_eval(f'{{{s}}}').items()}
                      for s in Original['words']], index=Original['id']
                     ).fillna(0, downcast='infer')

输出:

    A  B  C  D
id            
1   2  3  1  0
2   0  2  0  3

Python相关问答推荐

Python 枕头上的图像背景变黑

使用Python从HTTP打印值

如何使用关键参数按列对Pandas rame进行排序

使用Python进行网页抓取,没有页面

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

Twilio:CallInstance对象没有来自_的属性'

无法使用python.h文件; Python嵌入错误

通过交换 node 对链接列表进行 Select 排序

LAB中的增强数组

使用miniconda创建环境的问题

运行Python脚本时,用作命令行参数的SON文本

按列分区,按另一列排序

如何在UserSerializer中添加显式字段?

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

使用特定值作为引用替换数据框行上的值

在Python中使用if else或使用regex将二进制数据如111转换为001""

处理具有多个独立头的CSV文件

在Admin中显示从ManyToMany通过模型的筛选结果