我有以下DataFrame df
:
df =
min(arc) max(arc) min(gbm)_p1 max(gbm)_p1
1 10 2 5
0 11 1 6
如何计算成对的max
和min
列之间的差异?
预期结果:
diff(arc) diff(gbm)_p1
9 3
11 5
我假设应该使用apply(lambda x: ...)
逐行计算差异,但是如何创建成对的列呢?就我而言,我应该只计算名称相同的列之间的差异,例如...(arc)
或...(gbm)_p1
。请注意,min
和max
前缀总是出现在列名的开头。
答案 0 :(得分:1)
想法用DataFrame
用DataFrame.filter
过滤两个regex
,其中^
是字符串rename
的开头,所以可以减去,因为相同的列两者中的名字:
df1 = df.filter(regex='^min').rename(columns= lambda x: x.replace('min','diff'))
df2 = df.filter(regex='^max').rename(columns= lambda x: x.replace('max','diff'))
df = df2.sub(df1)
print (df)
diff(arc) diff(gbm)_p1
0 9 3
1 11 5
编辑:
print (df)
id min(arc) max(arc) min(gbm)_p1 max(gbm)_p1
0 123 1 10 2 5
1 546 0 11 1 6
df1 = df.filter(regex='^min').rename(columns= lambda x: x.replace('min','diff'))
df2 = df.filter(regex='^max').rename(columns= lambda x: x.replace('max','diff'))
df = df[['id']].join(df2.sub(df1))
print (df)
id diff(arc) diff(gbm)_p1
0 123 9 3
1 546 11 5