【问题标题】:Flatten a list of elements in Pandas DataFrame展平 Pandas DataFrame 中的元素列表
【发布时间】:2018-09-02 06:26:27
【问题描述】:

我的数据结构是:

ds = [{
    "name": "groupA",
    "subGroups": [123,456]
},
{
    "name": "groupB",
    "subGroups": ['aaa', 'bbb' , 'ccc']
}]

这给出了以下数据框

df = pd.DataFrame(ds)

    name    subGroups
0   groupA  [123, 456]
1   groupB  [aaa, bbb, ccc]   

我想要:

    name    subGroupsFlattend
0   groupA  123
1   groupA  456
2   groupB  aaa
3   groupB  bbb
4   groupB  ccc

有什么想法吗?

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    使用explode:

    df = df.explode('subGroups')
    

    【讨论】:

      【解决方案2】:

      YOBEN_S 解决方案,但对于大数据帧效率更高。

      from itertools import chain
      pd.DataFrame({'name':df.name.repeat(df.subGroups.str.len()),
                    'subGroup':list(chain.from_iterable(df.subGroups.to_list()))})
      

      【讨论】:

        【解决方案3】:

        你可以使用json_normalize:

        from pandas.io.json import json_normalize
        
        df = json_normalize(ds,  ['subGroups'], 'name').rename(columns={0:'subGroupsFlattend'})
        print (df)
          subGroupsFlattend    name
        0               123  groupA
        1               456  groupA
        2               aaa  groupB
        3               bbb  groupB
        4               ccc  groupB
        

        扁平化字典的替代解决方案:

        L = [y for x in ds for y in zip(x["subGroups"], [x["name"]] * len(x["subGroups"]))]
        print (L)
        [(123, 'groupA'), (456, 'groupA'), ('aaa', 'groupB'), ('bbb', 'groupB'), ('ccc', 'groupB')]
        
        df = pd.DataFrame(L, columns=['subGroupsFlattend','name'])
        print (df)
          subGroupsFlattend    name
        0               123  groupA
        1               456  groupA
        2               aaa  groupB
        3               bbb  groupB
        4               ccc  groupB
        

        编辑:

        from itertools import chain
        df = pd.DataFrame(ds)
        
        df1 = pd.DataFrame({
            'subGroups' : list(chain.from_iterable(df['subGroups'].tolist())), 
            'name' : df['name'].values.repeat(df['subGroups'].str.len())
        })
        print (df1)
             name subGroups
        0  groupA       123
        1  groupA       456
        2  groupB       aaa
        3  groupB       bbb
        4  groupB       ccc
        

        【讨论】:

        • 谢谢。如果我已经拥有所描述的 DataFrame 并且无法访问 DataStructure 怎么办?我应该先把DataFrame变成DataStructure吗?
        • @MoreThanFive - 如果已经创建了DataFrame,则使用编辑后的答案并展平lists。
        【解决方案4】:

        您可以通过以下方式修复您的输出:

        pd.DataFrame({'name':df.name.repeat(df.subGroups.str.len()),'subGroup':df.subGroups.sum()})
        Out[364]: 
             name subGroup
        0  groupA      123
        0  groupA      456
        1  groupB      aaa
        1  groupB      bbb
        1  groupB      ccc
        

        【讨论】:

        • @daiyue 扁平化列表
        • 如果series的dtype不是string,又不能用str.len怎么办?
        • @daiyue 你的意思不是字符串,在这个问题中它不是字符串而是对象(列表)
        猜你喜欢
        • 2021-05-07
        • 2019-11-05
        • 2018-10-01
        • 2016-12-01
        • 2016-10-31
        • 2014-07-24
        • 2018-12-11
        • 2018-09-24
        • 1970-01-01
        相关资源
        最近更新 更多