我有一个随机生成的嵌套列表,如下所示
[[[6008, 'BSC3', 'ST1'], ['LB1'], ['MTM2']], [[5227, 'BSC2', 'ST8'], ['LB1'], ['TTM1']]]
我也有一个看起来像这样的数据框:
我的问题是如何根据每个子列表中的元素为上面生成的每个子列表填充时间表内的特定位置?例如,在嵌套列表中,第一个子列表是:
[[6008, 'BSC3', 'ST1'], ['LB1'], ['MTM2']]
该列表的 2 元素具有代表星期一和时间段 #2(即 12:00PM - 2:00PM)的“MTM2”。
第二个子列表
[[5227, 'BSC2', 'ST8'], ['LB1'], ['TTM1']]
第二个元素是“TTM1”,代表星期二和时间段 #1(上午 9:30 - 下午 12:30)
我对上面示例的期望是数据框看起来像这样:
这是我的测试尝试(没有效果):
def append_to_timetable(self, solution):
for x in solution:
if x[2] == 'MTM1':
self.m.loc['Monday', 0] = x
print(self.m)
return self.m
编辑:增加了 13 个子列表(现在总共 15 个子列表)
[[[4220, 'BSC2', 'ST5'], ['CR1'], ['THTM2']], [[4201, 'BSC1', 'ST1'], ['LB1'], ['TTM3']], [[4222, 'BSC1', 'ST6'], ['CR1'], ['THTM2']], [[6226, 'BSC3', 'ST6'], ['LB1'], ['THTM3']], [[4220, 'BSC2', 'ST5'], ['LH1'], ['WTM1']], [[4227, 'BSC1', 'ST4'], ['LB1'], ['MTM2']], [[5225, 'BSC2', 'ST6'], ['LR1'], ['TTM3']], [[4227, 'BSC1', 'ST4'], ['LH2'], ['FTM1']], [[6224, 'BSC1', 'ST4'], ['LH1'], ['FTM3']], [[3225, 'BSC1', 'ST6'], ['LR1'], ['WTM2']], [[6224, 'BSC1', 'ST4'], ['LB1'], ['THTM1']], [[4220, 'BSC2', 'ST5'], ['LH2'], ['WTM2']], [[4210, 'BSC1', 'ST1'], ['LH2'], ['THTM2']], [[6224, 'BSC1', 'ST4'], ['LR1'], ['TTM3']], [[5227, 'BSC2', 'ST8'], ['LH1'], ['WTM1']]]
还想知道,是否可以在同一个特定插槽中插入两个或多个子列表?例如:
[[5225, 'BSC2', 'ST6'], ['LR1'], ['TTM3']]
and
[[4201, 'BSC1', 'ST1'], ['LB1'], ['TTM3']]
同时。它看起来像这样:
更新
编辑后,情况有点复杂,但想法保持不变:
cols = {'M': 'Monday', 'T': 'Tuesday', 'W': 'Wednesday',
'TH': 'Thursday', 'F': 'Friday'}
rows = df.index.tolist()
def get_loc(code):
m, t = code.split('TM')
col = cols[m]
row = rows[int(t) - 1]
return (row, col)
# Decode each element of the list
mi = pd.MultiIndex.from_tuples(tuple(get_loc(x[2][0]) for x in l),
names=['row', 'col'])
out = pd.Series([l]).explode().to_frame('data').set_index(mi).reset_index() \
.pivot_table('data', 'row', 'col', aggfunc=list, fill_value='') \
.reindex(index=df.index, columns=df.columns, fill_value='')
输出:
周一 | 星期四 | 周三 | 周四 | 星期五 | |
---|---|---|---|---|---|
上午 9:30 - 下午 12:30 | [[[4220, 'BSC2', 'ST5'], ['LH1'], ['WTM1']], [[5227, 'BSC2', 'ST8'], ['LH1'], ['WTM1' ]]] | [[[6224, 'BSC1', 'ST4'], ['LB1'], ['THTM1']]] | [[[4227, 'BSC1', 'ST4'], ['LH2'], ['FTM1']]] | ||
中午 12:00 - 下午 2:00 | [[[4227, 'BSC1', 'ST4'], ['LB1'], ['MTM2']]] | [[[3225, 'BSC1', 'ST6'], ['LR1'], ['WTM2']], [[4220, 'BSC2', 'ST5'], ['LH2'], ['WTM2' ]]] | [[[4220, 'BSC2', 'ST5'], ['CR1'], ['THTM2']], [[4222, 'BSC1', 'ST6'], ['CR1'], ['THTM2' ]], [[4210, 'BSC1', 'ST1'], ['LH2'], ['THTM2']]] | ||
下午 2:00 - 下午 5:00 | [[[6226, 'BSC3', 'ST6'], ['LB1'], ['THTM3']]] | [[[6224, 'BSC1', 'ST4'], ['LH1'], ['FTM3']]] |
数据:
df = pd.DataFrame(columns=['Monday', 'Thuesday', 'Wednesday', 'Thursday', 'Friday'],
index=['9:30AM - 12:30PM', '12:00PM - 2:00PM', '2:00PM - 5:00PM'])
l = [[[4220, 'BSC2', 'ST5'], ['CR1'], ['THTM2']],
[[4201, 'BSC1', 'ST1'], ['LB1'], ['TTM3']],
[[4222, 'BSC1', 'ST6'], ['CR1'], ['THTM2']],
[[6226, 'BSC3', 'ST6'], ['LB1'], ['THTM3']],
[[4220, 'BSC2', 'ST5'], ['LH1'], ['WTM1']],
[[4227, 'BSC1', 'ST4'], ['LB1'], ['MTM2']],
[[5225, 'BSC2', 'ST6'], ['LR1'], ['TTM3']],
[[4227, 'BSC1', 'ST4'], ['LH2'], ['FTM1']],
[[6224, 'BSC1', 'ST4'], ['LH1'], ['FTM3']],
[[3225, 'BSC1', 'ST6'], ['LR1'], ['WTM2']],
[[6224, 'BSC1', 'ST4'], ['LB1'], ['THTM1']],
[[4220, 'BSC2', 'ST5'], ['LH2'], ['WTM2']],
[[4210, 'BSC1', 'ST1'], ['LH2'], ['THTM2']],
[[6224, 'BSC1', 'ST4'], ['LR1'], ['TTM3']],
[[5227, 'BSC2', 'ST8'], ['LH1'], ['WTM1']]]
旧答案
您可以使用函数来解码索引和列:
df = pd.DataFrame(columns=['Monday', 'Thuesday', 'Wednesday', 'Thursday', 'Friday'],
index=['9:30AM - 12:30PM', '12:00PM - 2:00PM', '2:00PM - 5:00PM'])
l = [[[6008, 'BSC3', 'ST1'], ['LB1'], ['MTM2']],
[[5227, 'BSC2', 'ST8'], ['LB1'], ['TTM1']]]
# Check for Thursday encoding?
day_to_col = {'M': 0, 'T': 1, 'W': 2, 'TH': 3, 'F': 4}
def get_loc(code):
m, t = code.split('TM')
col = day_to_col[m]
row = int(t) - 1
return (row, col)
df.to_numpy()[tuple(get_loc(x[2][0]) for x in l)] = l
输出:
>>> df
Monday Thuesday Wednesday Thursday Friday
9:30AM - 12:30PM NaN [[5227, BSC2, ST8], [LB1], [TTM1]] NaN NaN NaN
12:00PM - 2:00PM [[6008, BSC3, ST1], [LB1], [MTM2]] NaN NaN NaN NaN
2:00PM - 5:00PM NaN NaN NaN NaN NaN
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句