按DataFrame.filter 选择所有列,按string 列比较并按Trues 的第一个DataFrame.idxmax 获取列名称:
print (df.filter(regex='string\.\d'))
string.1 string.2
0 abc poi
1 123 xyz
2 tzv pqr
3 lmn lmn
s = df.filter(regex='string\.\d').eq(df['string'], axis=0).idxmax(axis=1)
print (s)
0 string.1
1 string.2
2 string.2
3 string.1
dtype: object
如果要选择没有前 2 个的所有列,请使用 DataFrame.iloc:
s = df.iloc[:, 2:].eq(df['string'], axis=0).idxmax(axis=1)
print (s)
0 string.1
1 string.2
2 string.2
3 string.1
dtype: object
如果可能,某些行无法匹配,请使用 numpy.where 和 DataFrame.any 以避免首先返回 False 列:
print (df)
color string col_new string.1 string.2
0 red abc qwer abc poi
1 blue xyz zxcv 123 xyz
2 green pqr uyit tzv pqr
3 pink lmn nbtw lmn lmn
3 pink lmn nbtw ttt rrr <- no lmn values in another columns
mask = df.filter(regex='string\.\d').eq(df['string'], axis=0)
out = np.where(mask.any(axis=1), mask.idxmax(axis=1), np.nan)
print (out)
['string.1' 'string.2' 'string.2' 'string.1' nan]
原方案返回错误输出:
print (df.filter(regex='string\.\d').eq(df['string'], axis=0).idxmax(axis=1))
0 string.1
1 string.2
2 string.2
3 string.1
3 color
dtype: object
编辑:
print (df)
color string col_new string.1 string.2
0 red abc qwer abctyrf poi
1 blue xyz zxcv 123 xyz
2 green pqr uyit tzv pqr
3 pink lmn nbtw lmn lmn
#default index
df = df.reset_index(drop=True)
#column for test
st = df['string']
#for eac hrow is tested subtring by st
s = df.filter(regex='string\.\d').apply(lambda x: x.str.contains(st.loc[x.name]), axis=1)
print (s)
string.1 string.2
0 True False
1 False True
2 False True
3 True True