我有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)
但是我迷失了前进的方向。
答案 0 :(得分:2)
Gwenersl解决方案将所有没有被difference
过滤的ID
和SELECT
的列与DataFrame.eq
(==
)进行比较,通过检查第一个True
值idxmax
,如果不存在,则将匹配值设置为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