代码之家  ›  专栏  ›  技术社区  ›  D500

添加数据时从数据帧中删除列表

  •  1
  • D500  · 技术社区  · 7 年前

    开始于:

    import pandas as pd
    
    lis1= [['apples'],['bananas','oranges','cinnamon'],['pears','juice']]
    lis2= [['john'],['stacy'],['ron']]
    
    pd.DataFrame({'fruits':lis1,'users':lis2})
    
                             fruits    users
    0                      [apples]   [john]
    1  [bananas, oranges, cinnamon]  [stacy]
    2                [pears, juice]    [ron]
    

    最后我想说:

    lis3= ['apples','bananas','oranges','cinnamon','pears','juice']
    lis4= ['john','stacy','stacy','stacy','ron','ron']
    
    pd.DataFrame({'fruits': lis3, 'users':lis4})
    
         fruits  users
    0    apples   john
    1   bananas  stacy
    2   oranges  stacy
    3  cinnamon  stacy
    4     pears    ron
    5     juice    ron
    

    首先,我需要创建一个新的dataframe,其中每个项都位于自己的行中。其次,name变量需要根据“水果”的数量进行重复。看看这个例子,约翰有一个水果,而斯泰西有5个水果——所以在用户名下,斯泰西必须重复5次。

    3 回复  |  直到 7 年前
        1
  •  2
  •   cpander    7 年前

    假设 lis1 lis2 如果有相同数量的元素,则可以在压缩列表后使用列表理解来实现这一点。

    pd.DataFrame(
      [{'fruit':F, 'users':U} for (f, u) in zip(lis1, lis2) for F in f for U in u]
    )
    

    下面的代码生成以下输出:

          fruit    users
    0    apples     john
    1   bananas    stacy
    2   oranges    stacy
    3  cinnamon    stacy
    4     pears      ron
    5     juice      ron
    
        2
  •  3
  •   piRSquared    7 年前

    itertools

    from itertools import chain, product, starmap
    
    pd.DataFrame(
        [*chain(*starmap(product, zip(df.fruits, df.users)))],
        columns=df.columns
    )
    
         fruits  users
    0    apples   john
    1   bananas  stacy
    2   oranges  stacy
    3  cinnamon  stacy
    4     pears    ron
    5     juice    ron
    

    如果您只有2列,这也适用

    pd.DataFrame(
        [*chain(*starmap(product, zip(*map(df.get, df))))],
        columns=df.columns
    )
    

    generator

    def f(z):
      for A, B in z:
        for a in A:
          for b in B:
            yield (a, b)
    
    pd.DataFrame([*f(zip(df.fruits, df.users))], columns=df.columns)
    
         fruits  users
    0    apples   john
    1   bananas  stacy
    2   oranges  stacy
    3  cinnamon  stacy
    4     pears    ron
    5     juice    ron
    
        3
  •  1
  •   sacuL    7 年前

    开始于:

    >>> df
                             fruits    users
    0                      [apples]   [john]
    1  [bananas, oranges, cinnamon]  [stacy]
    2                [pears, juice]    [ron]
    

    final = (df.stack().apply(pd.Series)
             .stack(0).unstack(1)
             .ffill()
             .reset_index(drop=True))
    
    >>> final
         fruits  users
    0    apples   john
    1   bananas  stacy
    2   oranges  stacy
    3  cinnamon  stacy
    4     pears    ron
    5     juice    ron