удаление списков из фреймов данных при добавлении данных

1

Начиная с:

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

Во-первых, мне нужно создать новый фреймворк с каждым элементом, сидящим в его собственной строке. Во-вторых, переменная имени должна повторяться в зависимости от количества "плодов". Поэтому, глядя на пример, у Джона есть один фрукт, в то время как у Стейси 5 fruits--, поэтому под именами пользователей Stacy нужно повторять 5 раз.

Теги:
pandas
dataframe

3 ответа

2
Лучший ответ

Предполагая, что 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
  • 0
    Это работает только потому, что у меня есть доступ к lis1 / lis2 в примере. Для моего набора данных мне дан кадр данных с переменными столбца "fruit" и "user". Строки заполнены списками, как в примере выше. Будет ли lis1 по существу быть: df ['fruit]? - что делает серию, они работают как список?
3

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
1

Вот решение с большим количеством укладки и распаковки:

Начиная с:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню