Выбрать значение из набора столбцов на основе значения и создать новый столбец со значением?

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

итак, если у меня есть фрейм данных pandas, например:

    A  B  C  D
0  1  2  3  a 
1  2  4  6  a
2  4  8  8  b
3  2  3  5  c
 

и хотите вставить строку ‘E’, выбрав из столбцов ‘A’, ‘B’ или ‘C’ на основе условий в столбце ‘D’, как бы я это сделал? Например: если D == a, выберите «A», в противном случае выберите «B», выводя:

    A  B  C  D  E
0  1  2  3  a  1
1  2  4  6  a  2
2  4  8  8  b  8
3  2  3  5  c  3
 

Заранее спасибо!

Ответ №1:

Это lookup

 df.lookup(df.index,df.D.str.upper())
Out[749]: array([1, 2, 8, 5], dtype=int64)

df['E']=df.lookup(df.index,df.D.str.upper())
 

Комментарии:

1. Переводится ли это также и на строки? Если бы у меня было `A B C D 0 a1 b2 c3 da 1 a2 b6 c6 da 2 a4 b8 c8 db 3 a2 b3 c5 dc ` И условия, если D == da, выбрать A, иначе D == db выбрать B, иначе, если D == dc выбрать C?

2. Извините, потерпите, я впервые использую stack. Поиск предназначен для массива, где метки столбцов и строк равны, верно? Не могли бы вы использовать это для масштабирования до массива NxM, где n>> m, и выбор столбцов будет помещен в середину набора данных?

3. @RoyHan что значит масштабировать?

4. @RoyHan Я не уверен, что понимаю ваш вопрос… Может быть, лучше закрыть этот вопрос (отметьте галочкой один из ответов слева) и открыть новый?

5. Извините, я должен был быть более конкретным. В настоящее время у меня есть (1200, 10) в основном строковый фрейм данных, и цель состоит в том, чтобы добавить столбец, скажем, «Z» в df, проверив значение последнего столбца, скажем, «Y», на 3 известных параметра, скажем, «A, B, C», которых нет в df, но имеют соответствующий столбец ‘D, E, F’. Используя столбец ‘Y’, который имеет либо ‘A, B, либо C’, я должен выбрать либо ‘D, E, либо F’ и добавить это значение в качестве столбца ‘Z’. Большое вам спасибо за то, что ответили на мои вопросы!

Ответ №2:

Надеюсь, это поможет

 import pandas as pd
import random

data = []
D = ['a','b','c']

for i in range(4):

    new_list = []

    for x in range(3):

        new_list.append(random.randint(0,10))

    new_list.append(random.choice(D))
    data.append(new_list)

df = pd.DataFrame(data, columns = ['A', 'B', 'C', 'D'])

 

Выдаст случайные данные

 IN[120]:df
Out[120]: 
   A   B  C  D
0  1  10  8  a
1  4   9  7  a
2  4  10  6  b
3  5  10  4  b
 

Затем, чтобы добавить «E», выберите одну из букв из D.

 
choice = random.choice(list(df['D'])).upper()


E = list(df[choice])

df['E'] = E

 

ВОЗВРАТ

 IN[122]:df
Out[122]: 
   A   B  C  D  E
0  1  10  8  a  1
1  4   9  7  a  4
2  4  10  6  b  4
3  5  10  4  b  5
 

вы фиксируете данные в D так, чтобы они включали все буквы от a до c. Это было случайным

Ответ №3:

Lookup будет работать здесь. Следующие примеры возвращают integers и strings .

 import pandas as pd

d = ({
    'A' : ['x','y','z','x'],
    'B' : ['j','k','l','m'],
    'C' : ['n','o','p','q'],
    'D' : ['A','C','B','A'],
    }) 

df = pd.DataFrame(d)

df = df.assign(E=df.lookup(df.index, df.D.map('{}'.format)))
print(df)

   A  B  C  D  E
0  x  j  n  A  x
1  y  k  o  C  o
2  z  l  p  B  l
3  x  m  q  A  x
 

Аналогично для integer

 import pandas as pd

d = ({
    'A' : [1,2,3,4],
    'B' : [4,3,2,1],
    'C' : [5,6,7,8],
    'D' : ['A','C','B','A'],
    }) 

df = pd.DataFrame(d)

df = df.assign(E=df.lookup(df.index, df.D.map('{}'.format)))
print(df)

   A  B  C  D  E
0  1  4  5  A  1
1  2  3  6  C  6
2  3  2  7  B  2
3  4  1  8  A  4