Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 展开嵌套数据(json、Pandas)_Python_Pandas - Fatal编程技术网

Python 展开嵌套数据(json、Pandas)

Python 展开嵌套数据(json、Pandas),python,pandas,Python,Pandas,考虑一个 { "participant_id": 37, "response_date": "2016-05-19T07:19:32.620Z", "data": { "summary": 8, "q6": [ "1", "2" ], "q1": 0, "q2": 1, "q3": 1, "q4": 2,

考虑一个

{
    "participant_id": 37,
    "response_date": "2016-05-19T07:19:32.620Z",
    "data": {
        "summary": 8,
        "q6": [
            "1",
            "2"
        ],
        "q1": 0,
        "q2": 1,
        "q3": 1,
        "q4": 2,
        "q5": 2
    }
}, 
{
    "participant_id": 37,
    "response_date": "2016-05-26T07:14:24.7130Z",
    "data": {
        "summary": 8,
        "q6": [
            "1",
            "2",
            "4"
        ],
        "q1": 0,
        "q2": 1,
        "q3": 1,
        "q4": 2,
        "q5": 2
    }
}
这将产生一个数据帧:

        0   q1   q2   q3   q4   q5         q6  summary    participant_id           response_date
672   NaN  0.0  1.0  1.0  2.0  2.0     [1, 2]      8.0                37 2016-05-19 07:19:32.620
711   NaN  0.0  1.0  1.0  2.0  2.0  [1, 2, 4]      7.0                37 2016-05-26 07:14:24.713
如何将嵌套的
q6
扩展为“更宽”的格式?此属性
q6
最多可能包含4个值。因此,理想情况下应该是:

            0   q1   q2   q3   q4   q5   q6   q7   q8   q9   summary    participant_id           response_date
    672   NaN  0.0  1.0  1.0  2.0  2.0  1.0  1.0  0.0  0.0       8.0                37 2016-05-19 07:19:32.620
    711   NaN  0.0  1.0  1.0  2.0  2.0  1.0  1.0  0.0  1.0       7.0                37 2016-05-26 07:14:24.713
因此,基本上,方括号中的数字编码了4元素数组中
1
的位置

有一个简单的泛亚解决方案吗

编辑

某些条目被错误地颠倒或随机记录(第1行和第3行):

在执行任何进一步的操作之前,应该对它们进行排序

import pandas as pd
import numpy as np
df = pd.DataFrame({"q6":[[1,2],[1,2,4]]})
a = df.q6.values.tolist()
e = [np.array(x)-1 for x in a]
b = np.zeros((len(e),4))
for i in range(0, len(e)):
    b[i][e[i]] = 1
c = np.hsplit(b,4)
df1 = pd.DataFrame({'q6':c[0],'q7':c[1],'q8':c[2],'q9':c[3]})

最后,我用您想要的4列创建了另一个数据框。

我认为这并不容易

  • +用于新df
  • 用于添加缺少的值+
    重命名

  • 对于原件,(
    q6
    )列被删除

  • +用于新的列顺序



谢谢我的数据库中有几个输入错误,一些条目的顺序是相反的,例如,它们不是[1,2],而是[2,1]或[1,4,2]。有没有一个简单的解决方案来对它们进行排序?我认为可以工作-
df1.reindex(columns=range(1,5),fill\u value=0)。sort\u index(axis=1)。rename(columns=lambda x:'q{}。format(x+5))
它不起作用。请查看更新的问题。谢谢。我检查了它,我认为
sort\u index
不是必需的,因为
reindex
“sorts”
df1=df1.reindex(columns=range(1,5),fill\u value=0)
按顺序排列的值
1,2,3,4
。因此,如果值不同,可能需要更改
范围(1,5)
。嗯,另一个问题可能是-
df1=pd.get\u假人(pd.DataFrame(df['q6'].values.tolist()),前缀sep='',前缀='')
返回唯一的列名?
import pandas as pd
import numpy as np
df = pd.DataFrame({"q6":[[1,2],[1,2,4]]})
a = df.q6.values.tolist()
e = [np.array(x)-1 for x in a]
b = np.zeros((len(e),4))
for i in range(0, len(e)):
    b[i][e[i]] = 1
c = np.hsplit(b,4)
df1 = pd.DataFrame({'q6':c[0],'q7':c[1],'q8':c[2],'q9':c[3]})
df1 = pd.get_dummies(pd.DataFrame(df['q6'].values.tolist()), prefix_sep='', prefix='')
df1.columns = df1.columns.astype(int)
df1 =df1.reindex(columns=range(1,5),fill_value=0).rename(columns=lambda x: 'q{}'.format(x+5))
print (df1)
   q6  q7  q8  q9
0   1   1   0   0
1   1   1   0   1
df = pd.concat([df.drop('q6', axis=1), df1], axis=1)
mask = df.columns.str.startswith('q', na=False)
cols1 = df.columns[mask].tolist()
cols2 = df.columns[~mask].tolist()
cols = cols2[:1] + cols1 + cols2[1:]

df = df.reindex_axis(cols, axis=1)
print (df)
    0  q1  q2  q3  q4  q5  q6  q7  q8  q9  summary  participant_id  \
0 NaN   0   1   1   2   2   1   1   0   0        8              37   
1 NaN   0   1   1   2   2   1   1   0   1        8              37   

               response_date  
0   2016-05-19T07:19:32.620Z  
1  2016-05-26T07:14:24.7130Z  
    >>> df1
       participant_id  q1  q2  q3  q4  q5         q6              response_date  summary
    0              37   0   1   1   2   2     [1, 2]   2016-05-19T07:19:32.620Z        8
    1              37   0   1   1   2   2  [1, 2, 4]  2016-05-26T07:14:24.7130Z        8
    >>> def widen(oldQ6):
    ...     l = [0.0, 0.0, 0.0, 0.0]
    ...     for i in oldQ6:
    ...         l[int(i)-1] = 1.0
    ...     return l
    ... 
    >>> df1['q6'], df1['q7'], df1['q8'], df1['q9'] = zip(*df1['q6'].map(widen))
    >>> df1
       participant_id  q1  q2  q3  q4  q5  q6              response_date  summary  q7  q8  q9
    0              37   0   1   1   2   2   1   2016-05-19T07:19:32.620Z        8  1   0   0
    1              37   0   1   1   2   2   1  2016-05-26T07:14:24.7130Z        8  1   0   1