Панды - проверить, какой столбец соответствует другому столбцу - не логический - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующий фрейм данных в пандах:

target     A       B      C
0 cat      bridge  cat    brush
1 brush    dog     cat    shoe
2 bridge   cat     shoe   bridge 

Желаемый вывод:

  target   A       B      C       D
0 cat      bridge  cat    brush   B
1 brush    dog     cat    shoe    None
2 bridge   cat     shoe   bridge  C

Мне нужно знать, какой столбец соответствует моему целевому столбцу (столбец D).Я видел предыдущий пост 43093394, но мне недостаточно знать, совпадают ли столбцы или нет, мне нужно знать, какой столбец соответствует какой цели, и если ни один не совпадает.Та же проблема опубликована здесь 40320476, но в sql, так что это не помогло мне.

Ждем ваших отзывов, спасибо!

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Эти решения будут возвращать первый столбец, который соответствует, если таковые имеются.

idxmax

m = df.drop('target', 1).eq(df.target, axis=0)
df.assign(D=m.idxmax(1).where(m.any(1)))

   target       A     B       C    D
0     cat  bridge   cat   brush    B
1   brush     dog   cat    shoe  NaN
2  bridge     cat  shoe  bridge    C

np.where

t = df.target.values[:, None]
v = df.drop('target', 1)
m = t == v.values

i = np.where(m.any(1), v.columns[m.argmax(1)], np.nan)

df.assign(D=i)

   target       A     B       C    D
0     cat  bridge   cat   brush    B
1   brush     dog   cat    shoe  NaN
2  bridge     cat  shoe  bridge    C
0 голосов
/ 17 сентября 2018

Для вашего базового понимания я сделал кое-что ниже, но я рекомендую вам использовать ответы других экспертов, потому что они более общие.

df = pd.DataFrame([['cat', 'bridge','cat','brush'], ['brush','dog','cat','shoe'], ['bridge','cat','shoe','bridge' ]], columns=['target','A', 'B','C'])
mapper = {0:'A',1:'B',2:'C'}
func = lambda x : mappr[[x['A'],x['B'],x['C']].index(x['target'])] if x['target'] in [x['A'],x['B'],x['C']] else np.nan
df['D'] = df.apply(func, axis=1)
df

выход

   target   A   B   C   D
0   cat bridge  cat brush   B
1   brush   dog cat shoe    NaN
2   bridge  cat shoe    bridge  C
0 голосов
/ 17 сентября 2018

Использование eq с dot

df.loc[:,'A':].eq(df.target,0).dot(df.columns[1:])
Out[466]: 
0    B
1     
2    C
dtype: object
#df['D']=df.loc[:,'A':].eq(df.target,0).dot(df.columns[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...