使用Switch / Case语句通过遍历DF1中的行来构建DF2

问题描述 投票:0回答:1

我已经将标签页中的文件中的数据加载到DF中。 Tab数据是用模板填写的表单。

一个关键概念是可变行数构成一个条目的形式。在下面的DF1中,每当索引为“ A”时,就会开始一个新记录。因此,代码将需要遍历行以重建DF2中的每个记录。 每条记录将在DF2中表示为一行。

基于事实,DF1中的每个“ A”行都开始一个新的表单条目(以及DF2中的对应行),我们可以在下面的DF1中看到,在我的示例中只有两个条目,而在DF2中只有两个行。 Also imortant:每行中有不同数量的数据(列)。 Z具有2个(然后是NA),A具有3个,B具有4个。

所有这些都需要根据索引字母Z,A,B映射到DF2(请注意,还有更多的索引字母,但是此示例对此进行了简化)。

DF 1

-  A    B  C   D
Z xyz  5   NA  NA
A COA  aa  bb  NA
B RE   01  02  03
B DE   04  05  06
A COB  dd  ee  NA
B RE   01  02  03
B DE   04  05  06

过去,我已经在VBA中完成了这种事情,并且会使用CASE语句来转换数据。我发现在此线程中使用字典是一个很好的开始:

Replacements for switch statement in Python?

以上线程中的一个代码示例建议使用字典类型的case语句:

return{
    'a': 1,
    'b': 2,
}[x]

尽管我不确定在实践中如何执行,但这似乎可行。除了上面的每个A,B等,我还需要输出多个指令,具体取决于索引字母。在大多数情况下,说明是在DF2中的映射位置。例如,在我的:

索引A:将列A映射到DF2.iloc[1]['B']将B列映射到DF2.iloc[1]['C']将列C映射到DF2.iloc[1]['D']

索引B:与上面类似,将有四个指令。

DF2最终看起来像这样

-    A    B     C    D    E   F   G    H    I    J    K    L
1   xyz  COA   aa   bb   RE   01  02  03    DE   04   05   06
2   xyz  COB   dd   ee   RE   01  02  03    DE   04   05   06

因此,对于DF1中的每一行,将根据“索引字母”执行不同数量的指令。 所有指令都告诉代码将数据放置在DF2中的位置。列的每个不同索引字母的映射指令将始终相同,只有行将被更改(某些类型的计数器当您从DF2中的一个记录组移至下一个记录组时。

如何为开关/大小写类型格式的每种索引字母处理不同数量的指令?

谢谢

python-3.x pandas dictionary switch-statement
1个回答
1
投票
#filter only 2,3 index rows df1 = df[df.index.isin([2,3])].copy() #create new column for same value if 2 in index df1['new'] = np.where(df1.index == 2, 'Z', df1.A) #create groups by compare 2 df1['g'] = (df1.index == 2).cumsum() #convert columns to index and reshape, then change order df1 = (df1.set_index(['g','new']).unstack() .swaplevel(0,1, axis=1) .sort_index(axis=1, ascending=[False, True])) #default columns names df1.columns = range(len(df1.columns)) print (df1) 0 1 2 3 4 5 6 7 8 9 10 11 g 1 ABC aa bb cc R 01 02 NaN D NaN 03 04 2 DEF dd ee ff R 01 02 NaN D NaN 03 04
© www.soinside.com 2019 - 2024. All rights reserved.