2015-05-12 66 views
0

我有一个超过10,000行和超过400列的表。对于至少包含字符串'xyz'的列,我需要找到每行(在'xyz'列中)的最大值,并创建2个新列。返回一组列的每一行的最大值

第一个新列将包含这些“xyz”列的每一行的最大值。

第二个新列将包含检索最大值的列名称。我被困在创建第二列。我尝试了一些不起作用的东西;

Match = df[CompCol].isin[SpecList].all(axis=1) 

应该如何接近第二栏?

回答

0

这是否适合您?

import pandas as pd 
df = pd.DataFrame([(1,2,3,4),(2,1,1,4)], columns = ['xyz1','xyz2','xyz3','abc']) 
cols = [k for k in df.columns if 'xyz' in k] 

df['maxval'] = df[cols].apply(lambda s: max(zip(s, s.keys()))[0],1) 
df['maxcol'] = df[cols].apply(lambda s: max(zip(s, s.keys()))[1],1) 

df 

Out[753]: 
    xyz1 xyz2 xyz3 abc maxval maxcol 
0  1  2  3 4  3 xyz3 
1  2  1  1 4  2 xyz1 
+0

谢谢。这很完美。 – David

+0

我是一个总共noob在这一切。如果你可以一行一行地解释每条线的功能,那就像天堂的法力值 – David

3

使用'正则表达式'和'idmax'的另一种方法。

df = pd.DataFrame({'xyz1': [10, 20, 30, 40], 'xyz2': [11, 12,13,14],'xyz3':[1,2,3,44],'abc':[100,101,102,103]}) 

    df['maxval']= df.filter(regex='xyz').apply(max, axis=1) 

    df['maxval_col'] = df.filter(regex='xyz').idxmax(axis=1) 


    abc xyz1 xyz2 xyz3 maxval maxval_col 
    100 10 11  1  11  xyz2 
    101 20 12  2  20  xyz1 
    102 30 13  3  30  xyz1 
    103 40 14 44  44  xyz3 
+0

那就是漂亮的代码。你可以将'df.filter(regex ='xyz')'保存在一个变量中。 – fixxxer

+0

对!谢谢 .. –

相关问题