Python 熊猫:处理多层原木的最佳方法?

Python 熊猫:处理多层原木的最佳方法?,python,pandas,Python,Pandas,对于一个研究项目,我们正在一个对话系统中记录击键。我们的日志分为三层:对话(关于对话本身的元数据,包括用户/发言人),消息(对话中的每条消息)和击键(键入或移除的每个键都有毫秒时间戳) 样本数据: 我们的目标是为每个用户计算各种类型的输入速率度量(例如,每分钟有多少个字母,还包括单词之间的停顿等),总的来说,每个消息和每个对话 考虑到我们的数据分析目标和方法,pandas似乎是一个合乎逻辑的选择 但是,操作3个相关的分层数据帧(1conversation∋ N消息∋ NNN击键)孤立地产生了相当

对于一个研究项目,我们正在一个对话系统中记录击键。我们的日志分为三层:
对话
(关于对话本身的元数据,包括用户/发言人),
消息
(对话中的每条消息)和
击键
(键入或移除的每个键都有毫秒时间戳)

样本数据:

我们的目标是为每个用户计算各种类型的输入速率度量(例如,每分钟有多少个字母,还包括单词之间的停顿等),总的来说,每个消息和每个对话

考虑到我们的数据分析目标和方法,
pandas
似乎是一个合乎逻辑的选择


但是,操作3个相关的分层数据帧(1
conversation
∋ N
消息
∋ NNN
击键
)孤立地产生了相当多的复杂性。例如,我们试图为确定的
message.msgId
)计算编写消息所花费的总时间(=last
keystroke.time
——first
keystroke.time
),但从一个数据帧(
keystrokes
)开始计算,然后填充另一个(
消息
)在矢量化命令中执行似乎已经相当复杂


管理此数据集的最佳方法是什么?我最近了解到:我们是否应该将所有内容都放在一个巨大的数据框中,每按一次键(一种“长”格式),
对话
消息
数据重复多次?它不会导致更多的性能问题吗(我们正在查看数千条消息和数百万次按键)?或者有没有一种方法可以执行某种类型的
dict
dict
dict

“但是从一个数据帧(击键)计算,然后填充另一个数据帧(消息)似乎已经相当复杂,在一个矢量化命令中执行”不一定,merge和groupby总是很方便。@xyzjayne:所以您建议将所有内容合并到一个数据帧中,然后(通过groupby)计算这个非常长的数据帧中的新变量?我建议将它们分开,例如,当您需要向对话添加属性(消息计数)时,处理消息并将该信息合并到对话中。
import pandas as pd

conversations = pd.DataFrame({'convId': [1],
                              'userId': [849]})
messages = pd.DataFrame({'convId': [1,1],
                         'msgId': [1,2],
                         'text': ['Hi!', 'How are you?']})
keystrokes = pd.DataFrame({'msgId': [1,1,1,2,2,2,2],
                           'key': ['H', 'i', '!', 
                                   'H', 'o', 'w', ' '],
                           'time': ['2018-07-13 13:16:56.001', '2018-07-13 13:16:56.354', '2018-07-13 13:16:56.958', 
                                    '2018-07-13 13:17:07.012', '2018-07-13 13:17:07.123', '2018-07-13 13:17:07.653', '2018-07-13 13:17:07.430']})