在Excel中,我有一个类似下面的映射表,其中列B-L分别包含来自两个单独数据集的列标题的名称,需要将这些名称映射到由两个单独的数据集组成的新的串联数据集中的列A中的新列标题。
A B C D E F G H I J K L
Ant Car Bin
Bat Bat Gat Rat Mat Sat Pat Fat Cat Hat在上面的示例中,来自数据集1(列B)的Bat需要映射到新的级联数据集(列A)中的Bat,并且来自数据集2的列E-L中的列标题需要全部映射到Bat (列A),以便将数据集2中这些列下面的行中的数据相加在一起,即
Bat = Gat + Rat + Mat + Sat + Pat + Fat + Cat + Hat如果用户将来可以选择将数据集1或数据集2中的列分别添加到C-D或F-L列中,并期望Python代码能够识别这一点,并以上面的附加形式连接数据,则会出现上述增加的复杂性。
我知道pandas中的groupby功能可以用来对Gat, Mat, Sat etc进行额外的分组,但我不知道如何处理允许用户更改映射表的问题。
我曾考虑使用for循环迭代地检查每个单元格的值,以检查用户在C-D和F-L列下输入列标题的位置,并忽略NaN单元格,但是如何继续处理映射呢?
感谢您的帮助。
发布于 2020-10-29 21:00:34
您需要创建一个二级映射,它是原始映射的转置,并且只包括具有多对一映射的列的子集(即Col L)。
对具有多个条目的行过滤此映射,即
min_nas = 1
map_sub = map_sub.loc[:, (map_sub.notnull().sum(axis=0) > min_nas)]转置回法线,使用pd.melt(),并附加回原始贴图,仅保留A、B和E列。然后按如下方式一对一地继续进行贴图:
map_sub = map_sub.T
map_sub.reset_index(level='[insert name of Col A here]', inplace=True)
keys = [c for c in map_sub if c.startswith('[insert Col E-L name prefix here]')]
map_sub = pd.melt(map_sub, id_vars='[insert name of Col A here]', value_vars=keys, value_name='[insert name of Col E here]')清理:
map_sub = map_sub.dropna() # drop all rows and columns with nan
del map_sub['variable'] # remove variable column附加到原始映射:
newmapping = mapping.append(map_sub, sort=False, ignore_index=True)
newmapping = newmapping[['[insert name of Col A here]','[insert name of Col B here]', '[insert name of Col E here]']] # keep just 3 relevant columns for one-to-one mapping.继续进行一对一的映射。
https://stackoverflow.com/questions/64357891
复制相似问题