【问题标题】:How to split tuple of tuples into columns如何将元组的元组拆分为列
【发布时间】:2018-04-30 19:44:42
【问题描述】:

我有一个 pandas 数据框,其中一列是一个带有嵌套元组的元组。嵌套元组有两个现有的 id。我想将总元组中的每个元素分解成新的附加列。到目前为止,这是我的 df:

df
  id1  id2   tuple_of_tuple
0 a    e    ('cat',100,('a','f'))
1 b    f    ('dog',100,('b','g'))
2 c    g    ('cow',100,('d','h'))
3 d    h    ('tree',100,('c','e'))

我试图在一小部分数据上实现下面的代码,它似乎有效。每个提取/分解的元素都有新的附加列。

df[['Link_1', 'Link_2','Link_3','Link_4']] = df['tuple_of_tuple'].apply(pd.Series)

但是当我将它应用于整个数据集时,我收到错误“ValueError:列必须与键长度相同”。 (我应该提一下,周围散落着几个 NaN,因为 tuple_of_tuple 列的行中的整个条目将只是 NaN)。我该如何解决这个问题?

【问题讨论】:

    标签: python pandas dataframe tuples


    【解决方案1】:

    这是使用 python3.6 的 * 解包运算符的一种非常优雅的方法:

    df2 = pd.DataFrame(
        data=[[*i, *j] for *i, j in df.pop('tuple_of_tuple')], 
        columns=['link_1', 'link_2', 'link_3', 'link_4']
    )
    

    然后您可以使用pd.concatdf2df 链接起来:

    pd.concat([df, df2], axis=1)
    
      id1 id2 link_1  link_2 link_3 link_4
    0   a   e    cat     100      a      f
    1   b   f    dog     100      b      g
    2   c   g    cow     100      d      h
    3   d   h   tree     100      c      e
    

    【讨论】:

    • 运行第一个代码时出现错误“TypeError: 'float' object is not iterable”
    • @guru 是否有一些行没有任何元组?根据您提供的数据,此代码假定行中的最后一项是元组
    • @COLDSPEED 是的,有些行只包含 NaN,因为在 tuple_of_tuples 列的特定行中根本没有元组
    • @guru 好的,再试一次:[[*i, *j] if not pd.isnull(j) else j for *i, j in df['tuple_of_tuple']]
    • @COLDSPEED 我发现了我的问题。我错误地实现了 dropna 代码,这带来了很多问题。正确实现它可以成功实现 ast.literal_eval 代码以及元组解包。非常感谢!
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多