Начиная с:
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 раз.
Предполагая, что 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
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
Вот решение с большим количеством укладки и распаковки:
Начиная с:
>>> 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