pandas 如何使用另一个 Dataframe 的值过滤 Dataframe

lf5gs5x2  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(220)

我有两个 Dataframe 。我想用条件“〉”和/或“〈”过滤第一个 Dataframe 。条件应为:

if df1.Type=df2.Parameters:
   dfFinal= df1.Amount > df2.Amount & df1.Count < df2.Count

结果将是dfTotal,即df 1中满足c2个条件的所有 Dataframe 。

df1 = pd.DataFrame({'Type': ['car', 'bike','car', 'motorbike','bike','bike'], 'Amount': [40,3,50, 699,60,90], 'Count': [10,1,2,4,3,2],'Item': ['a','b','t','u','i','e']})
df2 = pd.DataFrame({'Parameters': ['Amount', 'Count'], 'car': [30, 3], 'bike': [40,4], 'motorbike': [1000,7]})

只有df 1的行满足df 2的值目标的条件的最终 Dataframe :

dfTotal = pd.DataFrame({'Type': ['car','bike','bike'], 'Amount': [50,60,90], 'Count': [2,3,2], 'Item': ['t','i','e']})

我已经提出了一个问题,但目的不同。

fdx2calv

fdx2calv1#

解决此问题的一种方法是将DataFrame合并为一个,然后对目标行的结果运行查询。
假设您的数据如前所述,首先我们需要修改df 2,以便能够通过转置和格式化列来与df 1合并。

df2_modified = df2.T 
new_header = df2_modified.iloc[0] # Get the new header names
df2_modified = df2_modified[1:] # Remove header row
df2_modified.columns = new_header 
df2_modified = df2_modified.reset_index(names=['Type'])

# Rename the columns so we know what we're comparing
name_mapper = {'Amount' : 'amount_compare', 'Count' : 'count_compare'}
df2_modified = df2_modified.rename(name_mapper, axis = 1)
df2_modified

这应该给予我们:
| | 类型|数量_比较|计数_比较|
| - ------|- ------|- ------|- ------|
| 无|汽车|三十|三个|
| 1个|脚踏车|四十|四个|
| 第二章|摩托车|一千|七|
然后,我们可以使用以下命令merge()Type 列中的两个值:

df_merged = pd.merge(df1, df2_modified, on='Type')

它将重复我们对每种类型的比较值。
| | 类型|金额|计数|项目|数量_比较|计数_比较|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 无|汽车|四十|十个|项目a|三十|三个|
| 1个|汽车|五十|第二章|t|三十|三个|
| 第二章|脚踏车|三个|1个|B|四十|四个|
| 三个|脚踏车|六十|三个|我|四十|四个|
| 四个|脚踏车|九十|第二章|电子|四十|四个|
| 五个|摩托车|六九九|四个|乌|一千|七|
现在我们可以使用query()过滤数据

dfTotal = df_merged.query('Amount > amount_compare & Count < count_compare')

这将(大部分)给予我们想要的结果:
| | 类型|金额|计数|项目|数量_比较|计数_比较|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|汽车|五十|第二章|t|三十|三个|
| 三个|脚踏车|六十|三个|我|四十|四个|
| 四个|脚踏车|九十|第二章|电子|四十|四个|
获得示例dfTotalDataFrame所需的唯一额外步骤是删除比较列。

dfTotal.drop(['amount_compare', 'count_compare'], axis = 1)

| | 类型|金额|计数|项目|
| - ------|- ------|- ------|- ------|- ------|
| 1个|汽车|五十|第二章|t|
| 三个|脚踏车|六十|三个|我|
| 四个|脚踏车|九十|第二章|电子|

相关问题