我有两个数据帧: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/