我有两个数据帧:main_df(cols=['Technology', 'Condition1', Condition2'])和database_df(cols=['Technology', 'Values1', 'Values2'])

我已经根据Technology列对database_df进行了分组:

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

现在,我想做的是在main_df中获取pd.series main_df['Technology'],对于每一行检索相关的组,根据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方法。我意识到我可以为使用lambda函数的每个条目传递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]})


我希望使用这些df进行上述操作的结果是:

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

最佳答案

如果要在2个DataFrame之间进行比较,请使用带有将索引转换为列的外部联接,然后按条件过滤并最后过滤第一个匹配的值:

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

关于python - 如何有效地检索groupby对象作为pd.Series的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59876920/

10-12 22:18