我有一個超過10,000行和超過400列的表。對於至少包含字符串'xyz'的列,我需要找到每行(在'xyz'列中)的最大值,並創建2個新列。返回一組列的每一行的最大值
第一個新列將包含這些「xyz」列的每一行的最大值。
第二個新列將包含檢索最大值的列名稱。我被困在創建第二列。我嘗試了一些不起作用的東西;
Match = df[CompCol].isin[SpecList].all(axis=1)
應該如何接近第二欄?
我有一個超過10,000行和超過400列的表。對於至少包含字符串'xyz'的列,我需要找到每行(在'xyz'列中)的最大值,並創建2個新列。返回一組列的每一行的最大值
第一個新列將包含這些「xyz」列的每一行的最大值。
第二個新列將包含檢索最大值的列名稱。我被困在創建第二列。我嘗試了一些不起作用的東西;
Match = df[CompCol].isin[SpecList].all(axis=1)
應該如何接近第二欄?
這是否適合您?
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
使用'正則表達式'和'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
那就是漂亮的代碼。你可以將'df.filter(regex ='xyz')'保存在一個變量中。 – fixxxer
對!謝謝 .. –
謝謝。這很完美。 – David
我是一個總共noob在這一切。如果你可以一行一行地解釋每條線的功能,那就像天堂的法力值 – David