【问题标题】:removing lists from dataframes while adding data添加数据时从数据框中删除列表
【发布时间】:2019-02-24 03:30:11
【问题描述】:

开头:

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

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

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设 lis1lis2 具有相同数量的元素,您可以在压缩列表后使用列表推导来做到这一点。

    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
    

    【讨论】:

    • 这只是因为我可以访问示例中的 lis1/lis2。对于我的数据集,我得到了一个带有列变量“fruit”和“user”的数据框。这些行填充了与上面示例类似的列表。 lis1 本质上会是: df['fruit] 吗? -- 这使它成为一个系列,它们像列表一样工作吗?
    【解决方案3】:

    这是一个包含大量堆叠和拆解的解决方案:

    开始于:

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2017-10-28
      • 2020-10-29
      • 2021-01-12
      • 2021-09-29
      • 2021-01-07
      相关资源
      最近更新 更多