Как написать эффективную функцию поиска по нескольким критериям в пандах? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть такой фрейм данных.

enter image description here

Я хочу найти в столбцах zip и div, получить type и применить этот результат ко всем уникальным почтовым индексам. В некоторой степени сводная функция, но вместо агрегатной функции возвращается фактическое значение (предположим, что существует только одна комбинация zip и div)

.
df1 = pd.DataFrame(list(product(list(range(100,200)), ['A','B','C','D','E'])), columns=['zip', 'div'])
df1 = df1.drop(df1.index[np.random.randint(0,499,size=100)]).reset_index()
df1['type'] = np.random.choice(['P','Q','R'],size=df1.shape[0])

Я пробовал применить функцию / лямбда, но она очень медленная. Мои данные содержат 500K строк в df1 с 41K уникальных zip с и 15 уникальных div с

Есть ли эффективный способ получить результат, подобный следующему.

enter image description here

df2 = pd.DataFrame({'zip':[100,101],'A':['Q','P'],'B':['Q','Q'],'C':['Q','P'],'D':['Q','R'],'E':['Q','P']})

Предположим, что zip не числовой.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Альтернативное решение, если вы хотите использовать сводную таблицу:

df_pivot=df.pivot_table(index='zip',columns=['div'],aggfunc='first')
1 голос
/ 26 апреля 2019

Попробуйте с:

m=df.groupby('zip')['type'].apply(list)
n=pd.DataFrame(m.values.tolist(),columns=df['div'].unique(),index=m.index)
print(n)

     A  B  C  D  E
zip               
100  Q  Q  Q  Q  Q
101  P  Q  P  R  P

PS Вы не должны иметь div в качестве столбца, так как это функция панд (япредлагаю вам изменить его на что-то другое, кроме div)

...