我从中接收数据的源系统具有奇数结构。我想知道有比我发现的更好的方法来处理它。首先,这是数据的外观:
ID med_A med_B med_C med_D
AA cold flu nasal Nan
AA pain cold Nan Nan
BB bleed heart Nan Nan
CC cold bleed Nan Nan
解释,每个ID是唯一的患者,每个患者可能有很多行。单行代表一次去看医生。列med_A,...,med_D是患者接受的不同医学诊断。关于源系统的奇怪之处在于,后面的列在前面的列之后被填充。因此,在单次就诊时,患者的第一个诊断进入med_A,第二个诊断进入med_B,依此类推。
我想将列折叠起来,这样我就拥有:
ID MED
AA cold
AA flu
AA nasal
AA pain
AA cold
BB bleed
BB heart
CC cold
CC bleed
也请注意额外的复杂性:实际上,这些列的名称和顺序不是很好。我有二十多个这样的列,它们不均匀地分布在用于其他目的的数百个列中,而且它们也没有命名约定。
当前解决方案:
当前,我手动拉出所有相关的列名,并将它们存储在名为columns的列表中。另外,存储所有内容的主数据框称为df。
然后我的代码如下:
for column in columns:
df_temp = df[['ID', '{}'.format(column)]] # build temporary df to store first column
df_temp.columns = ['ID', 'MED'] # Set a column naming convention
df = df.append(df_temp)
df.drop(columns=columns) # Get rid of excess columns, only want MED
此方法的问题是:-难以扩大规模-对于熊猫的循环很慢
我想知道:还有更好的方法吗?
将DataFrame.set_index
与DataFrame.set_index
和双DataFrame.stack
一起使用-首先用于删除第二级,第二用于将索引转换为列:
DataFrame.stack