Используйте zip_longest
с None
с для пропущенных значений, в последний раз отмените их на ffill
и bfill
для групп:
d = {'date': ['29-03-2019', '30-03-2019', '31-03-2019'],
'tablenameFrom': [['customer'], ['order as o'], ['customer']],
'tablenameJoin': [[], ['customer as c', 'payment as p'], ['order']],
'attribute': [['customerID', 'another'], ['o.oderID', 'p.paymentID', 'c.firstName'],
['customerID', 'orderID']]}
df = pd.DataFrame(d, index=[1,2,3])
print (df)
date tablenameFrom tablenameJoin \
1 29-03-2019 [customer] []
2 30-03-2019 [order as o] [customer as c, payment as p]
3 31-03-2019 [customer] [order]
attribute
1 [customerID, another]
2 [o.oderID, p.paymentID, c.firstName]
3 [customerID, orderID]
from itertools import zip_longest
x = df['attribute']
y = df['tablenameFrom'] + df['tablenameJoin']
a = [(m, l, k) for m, (i, j)
in enumerate(zip_longest(x, y, fillvalue=[None]))
for k, l
in zip_longest(i, j, fillvalue=None)]
#print (a)
df1 = pd.DataFrame(a, columns=['date','tablename','attributename'])
df1['date'] = df['date'].values[df1['date'].values]
df1['tablename'] = df1.groupby('date')['tablename'].apply(lambda x: x.ffill().bfill())
для правильных значений соответствия можно использовать map
:
df2 = df1['tablename'].str.split(' as ', expand=True)
s = df2.dropna().drop_duplicates(1).set_index(1)[0]
print (s)
1
o order
c customer
p payment
Name: 0, dtype: object
df1['attributename'] = df2[1].map(s).fillna(df1['attributename'])
df1['tablename'] = df2[0]
print (df1)
date tablename attributename
0 29-03-2019 customer customerID
1 29-03-2019 customer another
2 30-03-2019 order order
3 30-03-2019 customer customer
4 30-03-2019 payment payment
5 31-03-2019 customer customerID
6 31-03-2019 order orderID