匹配值并在python中获取其列标题

时间:2018-11-19 05:49:55

标签: python pandas

Sample

我有1000 x 6数据框,其中A,B,C,D由1-10的人员进行了评分。

在SELECT列中,我有一个值,在所有情况下,该值都与A / B / C / D中的任何一个相同。

我想将“ SELECT”中的值更改为与其匹配的列的名称。例如,对于ID 1,SELECT = 1,D = 1,因此select的值应更改为D。

import pandas as pd
df = pd.read_excel("u.xlsx",sheet_name = "Sheet2",header = 0)

但是我迷失了前进的方向。

3 个答案:

答案 0 :(得分:2)

Gwenersl解决方案将所有没有被difference过滤的IDSELECT的列与DataFrame.eq==)进行比较,通过检查第一个Trueidxmax,如果不存在,则将匹配值设置为numpy.where的设置值no match

cols = df.columns.difference(['ID','SELECT'])
mask = df[cols].eq(df['SELECT'], axis=0)

df['SELECT'] = np.where(mask.any(axis=1), mask.idxmax(axis=1), 'no match')
print (df)
   ID  A  B  C  D SELECT
0   1  4  9  7  1      D
1   2  5  7  2  8      C
2   3  7  4  8  6      C

详细信息

print (mask)
       A      B      C      D
0  False  False  False   True
1  False  False   True  False
2  False  False   True  False

答案 1 :(得分:1)

假设A,B,C,D中的值相对于SELECT在每一行中都是唯一的,我会这样做:

>>> df
   ID  A  B  C  D  SELECT
0   1  4  9  7  1       1
1   2  5  7  2  8       2
2   3  7  4  8  6       8
>>>
>>> df_abcd = df.loc[:, 'A':'D']
>>> df['SELECT'] = df_abcd.apply(lambda row: row.isin(df['SELECT']).idxmax(), axis=1)
>>> df
   ID  A  B  C  D SELECT
0   1  4  9  7  1      D
1   2  5  7  2  8      C
2   3  7  4  8  6      C

答案 2 :(得分:0)

使用-

df['SELECT2'] = df.columns[pd.DataFrame([df['SELECT'] == df['A'], df['SELECT'] == df['B'], df['SELECT'] == df['C'], df['SELECT'] == df['D']]).transpose().idxmax(1)+1]

输出

    ID  A   B   C   D   SELECT  SELECT2
0   1   4   9   7   1   1   D
1   2   5   7   2   8   2   C
2   3   7   4   8   6   8   C