问题描述
我的任务是清理慈善机构设计的移动应用程序中的数据
在一个部分中,用户 Q/A 应用使用会话由一行表示。此部分由重复的问题答案字段对组成,其中一个字段代表提出的问题,然后它旁边的字段代表相应的答案。一起,每个问题/字段和答案列对代表一个独特的问题和答案。
起始数据
answers.0.answer answers.0.fieldName answers.1.answer answers.1.fieldName
5 0 avoidexercise 0.0 vomitflag
6 156 height 54.0 weight
7 1 affectedkneeside 3.0 painlocationknee
理想的输出
我被要求重新格式化该部分,以便每个问题形成一个列,相应的答案是该列中的一个字段
理想的输出
_id avoidexercise enjoyment fatigue2weeks height
5f27f29c362a380d3f9a9e46 1.0 yes 20.0 120.0
5f27f2ac362a380d3f9a9e4b 0.0 no 40.0 180.0
5f27f4d4362a380d3f9a9e52 1.0 yes 50.0 150.0
在此处输入图片说明
我的计划是创建许多数据透视表,从彼此 Q/A 对列,然后连接(外连接)然后内连接以删除重复
然而,原始数据帧包含数字和对象数据类型的混合
因此,似乎只有一些问题/答案列对转换为数据透视表。我尝试过使用各种聚合函数
p1 = ur.pivot_table(index=['_id'],columns= ['answers.0.fieldName'],values=['answers.0.answer'],aggfunc=lambda x: ' '.join(x))
p2 = ur.pivot_table(index=['_id'],columns= ['answers.1.fieldName'],values=['answers.1.answer'],aggfunc=lambda x: ' '.join(x))
p3 = ur.pivot_table(index=['_id'],columns= ['answers.2.fieldName'],values=['answers.2.answer'],aggfunc=lambda x: ' '.join(x))
I have also tried another lambda function
p1 = ur.pivot_table(index=['_id'],aggfunc=lambda x: ' '.join(str(v) for v in x)
到目前为止我得到的最远的是使用标准均值 aggfunc 运行枢轴
p1 = ur.pivot_table(index=['_id'],columns=['answers.0.fieldName'],values=['answers.0.answer'])
ps = [p1,p2,p3]
c = pd.concat(ps)
然后尝试删除合并行和列
df = c.sum(axis=1,level=1,skipna=False)
g = df.groupby('_id').agg(np.sum)
This returns a dataframe with the right shape
但是,它丢失了对象列中的值,我不确定所有数字列的准确度
为了克服这个问题,我考虑将尽可能多的数据转换为数字
c4 = c.apply(pd.to_numeric,errors='ignore').info()
然后将组合的数据透视表数据框拆分为数字和对象类型
nu = ['int16','int32','int64','float16','float32','float64']
cndf = c4.select_dtypes(include=nu)
o = ['object','bool','datetime64','category']
codf = c4.select_dtypes(include=o)
并在数字数据帧上执行与上述相同的 .sum 和 groupby 操作
n1 = cndf.sum(axis=1,skipna=False)
n2 = n1.groupby('_id').agg(np.sum)
然而,这仍然存在处理对象列的挑战
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)