考虑一个片段

{
    "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
    }
}

这将产生一个 Pandas 数据框:
        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

所以,基本上,方括号中的数字编码了 1 在 4 元素数组中的位置。

有没有简单的 Pandasian 解决方案?

编辑

一些条目被错误地颠倒或随机记录(第一和第三行):
        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]      7.0               37 2016-05-20 07:14:24.713
740   NaN  0.0  1.0  1.0  2.0  2.0  [2, 1]      8.0               37 2016-05-21 07:10:17.251
774   NaN  0.0  1.0  1.0  1.0  3.0  [1, 2]      8.0               37 2016-05-22 08:28:14.579
809   NaN  0.0  1.0  1.0  1.0  3.0  [1, 2]      8.0               37 2016-05-23 07:30:27.259

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

最佳答案

我觉得没那么容易。

  • DataFrame + get_dummies 用于新的 df
  • reindex 用于添加缺失值 + rename
  • concat 到原始,( q6 ) 列被删除
  • startswith + reindex_axis 用于列的新顺序

  • 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
    

    关于python - 展开嵌套数据(json、Pandas),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43519397/

    10-11 23:37