[英]multiple nested lists with permutations to pandas
我在 python 中有我的第一個嚴肅問題。
我有一些嵌套列表需要轉換為 Pandas DataFrame。 看起來很簡單,但對我來說是什么讓它具有挑戰性: - 列表很大(所以代碼需要很快) - 它們是嵌套的 - 當它們被嵌套時,我需要組合。
所以有這個輸入:
la = ['a', 'b', 'c', 'd', 'e']
lb = [[1], [2], [3, 33], [11,12,13], [4]]
lc = [[1], [2, 22], [3], [11,12,13], [4]]
我需要以下作為輸出
la lb lc
a 1 1
b 2 2
b 2 22
c 3 3
c 33 3
d 11 11
d 11 12
d 11 13
d 12 11
d 12 12
d 12 13
d 13 11
d 13 12
d 13 13
e 4 4
請注意,每當我有嵌套列表時,我都需要所有排列。 起初我只是簡單地嘗試:
import pandas as pd
pd.DataFrame({'la' : [x for x in la],
'lb' : [x for x in lb],
'lc' : [x for x in lc]})
但是尋找需要擴展和實際擴展(一個巨大的)DataFrame 的行似乎比修改我創建 DataFrame 的方式更難。
我看了一些關於 itertools( 在 Python 中展平一個淺表)、文檔( https://docs.python.org/3.6/library/itertools.html )和生成器( “yield”關鍵字有什么作用? ),並想出了這樣的事情:
import itertools
def f(la, lb, lc):
tmp = len(la) == len(lb) == len(lc)
if tmp:
for item in range(len(la)):
len_b = len(lb[item])
len_c = len(lc[item])
if ((len_b>1) or (len_c>1)):
yield list(itertools.product(la[item], lb[item], lc[item]))
## above: list is not the result I need,
## without it it breaks (not an iterable)
else:
yield (la[item], lb[item], lc[item])
else:
print('error: unequal length')
我測試的
my_gen =f(lit1, lit2, lit3)
pd.DataFrame.from_records(my_gen)
這......好吧......當我yield
itertools
(它沒有長度)時會中斷,並在我將itertools
轉換為可迭代后創建錯誤的數據結構。
我的問題如下:
yield
ing itertools
解決該問題?f
函數有意義嗎?先感謝您!
我有一個解決方案:
import pandas as pd
from itertools import product
la = ['a', 'b', 'c', 'd', 'e']
lb = [[1], [2], [3, 33], [11,12,13], [4]]
lc = [[1], [2, 22], [3], [11,12,13], [4]]
list_product = reduce(lambda x, y: x + y, [list(product(*_)) for _ in zip(la,lb,lc)])
df = pd.DataFrame(list_product, columns=["la", "lb", "lc"])
print(df)
結果:
la lb lc
0 a 1 1
1 b 2 2
2 b 2 22
3 c 3 3
4 c 33 3
5 d 11 11
6 d 11 12
7 d 11 13
8 d 12 11
9 d 12 12
10 d 12 13
11 d 13 11
12 d 13 12
13 d 13 13
14 e 4 4
這不是一個抽象的解決方案,但它確實得到了您正在尋找的結果。 我期待看到一個更以熊貓為中心的答案來解決這個問題,但同時提供這個答案。
import pandas as pd
la = ['a', 'b', 'c', 'd', 'e']
lb = [[1], [2], [3, 33], [11,12,13], [4]]
lc = [[1], [2, 22], [3], [11,12,13], [4]]
l1 = []
l2 = []
l3 = []
l1Temp = []
l2Temp = []
l3Temp = []
for i, listInt in enumerate(lb):
if type(listInt == list):
for j, item in enumerate(listInt):
# print('%s - %s' % (lb[i], lc[i][j]))
l1Temp.append(la[i])
l2Temp.append(lb[i][j])
l3Temp.append(lc[i])
# print('%s - %s' % (l1[i], l2[i]))
else:
l1Temp.append(la[i])
l2Temp.append(lb[i])
l3Temp.append(lc[i])
# print('%s - %s' % (lb[i], lc[i]))
for i, listInt in enumerate(l3Temp):
if type(listInt == list):
for j, item in enumerate(listInt):
l1.append(l1Temp[i])
l2.append(l2Temp[i])
l3.append(l3Temp[i][j])
else:
l1.append(l1Temp[i])
l2.append(l2Temp[i])
l3.append(l3Temp[i])
for i, item in enumerate(l3):
print('%s - %s - %s' % (l1[i], l2[i], l3[i]))
df = pd.DataFrame({'la':[x for x in l1],
'lb':[x for x in l2],
'lc': [x for x in l3]})
print(df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.