Как эффективно получать объекты groupby как функцию pd.Series - PullRequest
1 голос
/ 23 января 2020

У меня есть два кадра данных: main_df (cols=['Technology', 'Condition1', Condition2']) и database_df (cols=['Technology', 'Values1', 'Values2']).

. Я сгруппировал database_df в зависимости от столбца Technology:

grouped = database_df.groupby(['Technology'])

Теперь я хотел бы получить pd.series main_df['Technology'] в main_df, для каждой строки извлечь соответствующую группу, отфильтровать в соответствии с некоторыми условиями в зависимости от некоторых других значений столбца main_df и вернуть Столбец ['Character'] первой строки (из database_df), который удовлетворяет условиям.

Т.е. я хотел бы сделать что-то вроде:

grouped = database_df.groupby(['Technology'])

main_df['New column'] = (
grouped.get_group(main_df['Technology']).loc[ 
(grouped.get_group(main_df['Technology']))['Values1'] > main_df['Condition1']) 
& (grouped.get_group(main_df['Technology']))['Values2'] > main_df['Condition2'])]['Character'][0])

Однако я не могу передать pd.Series как аргумент метода get_group. Я понимаю, что, возможно, мог бы передать main_df['Technology'] в качестве str для каждой записи, применяющей лямбда-функцию, но я хотел бы выполнить эту операцию векторным способом ... Есть ли способ?

ПРИМЕР МИНИМАЛЬНОЙ ЖИЗНИ:

main_df = pd.DataFrame({'Technology': ['A','A','B'], 
'Condition1': [20, 10, 10], 
'Condition2': [100, 200, 100]})

database_df = pd.DataFrame({'Technology':['A', 'A', 'A', 'B', 'B', 'B'],
'Values1':[10, 20, 30, 10, 20, 30], 
'Values2':[100, 200, 300, 100, 200, 300]
'Character':[1, 2, 3, 1, 2, 3]})

Я бы хотел, чтобы результат вышеупомянутой операции с этими dfs был:

main_df['New column'] = [3, 3, 2]

1 Ответ

1 голос
/ 23 января 2020

Если вы хотите сравнить 2 DataFrames, используйте внешнее объединение с преобразованием индекса в столбец, затем отфильтруйте по условиям и отфильтруйте значения первого совпадения:

df = main_df.reset_index().merge(database_df,  on='Technology', how='outer')
m = (df['Values1'] > df['Condition1']) & (df['Values2'] > df['Condition2'])

main_df['New column'] = df[m].groupby('index')['Character'].first()
print (main_df)
  Technology  Condition1  Condition2  New column
0          A          20         100           3
1          A          10         200           3
2          B          10         100           2
...