#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