组合对象数据类型行和列而不丢失数据

问题描述

我的任务是清理慈善机构设计的移动应用程序中的数据

一个部分中,用户 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 (将#修改为@)