python - Pandas - 当字符串匹配时选择两个值之间的所有行

标签 python pandas

我有两个数据框:

import pandas as pd
import numpy as np
d = {'fruit': ['apple', 'pear', 'peach'] * 5, 'values': np.random.randint(0,1000,15)}
df = pd.DataFrame(data=d)

d2 = {'fruit': ['apple', 'pear', 'peach'] * 2, 'min': [43, 196, 143, 174, 510, 450], 'max': [120, 310, 311, 563, 549, 582]}
df2 = pd.DataFrame(data=d2)

我想选择 df 中的所有行与匹配fruitdf2 values之间minmax .

我正在尝试这样的事情:

df.loc[df['fruit'].isin(df2['fruit'])].loc[df['values'].between(df2['min'], df2['max'])]

但可以预见的是,这会返回一个 ValueError: Can only Comparesamely-labeled Series objects.

编辑:您会注意到 fruitdf2 中重复。这是故意的。我仍在尝试抓取 min 之间的行和max如上所述,但我不想只是折叠水果并获取绝对 min 之间的行和max .

例如,在df1中哪里fruit == 'apple' 我想要所有带有 values 的行43-120 和 174-563 之间。

最佳答案

df3 = df.merge(df2, on='fruit', how='inner') # Thanks for Henry Ecker for suggesting inner join
df3 = df3.loc[(df3['min'] < df3['values']) & (df3['max'] > df3['values'])]
df3

输出

    fruit   values  min max
3   apple   883     467 947
6   apple   805     467 947
9   apple   932     467 947
11  peach   331     307 618
12  apple   665     467 947

如果我们不希望输出中包含 minmax col

df3 = df3.drop(columns=['min', 'max'])
df3

输出

    fruit   values
3   apple   883
6   apple   805
9   apple   932
11  peach   331
12  apple   665

关于python - Pandas - 当字符串匹配时选择两个值之间的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67595977/

相关文章:

Python删除两个for循环并使用一些迭代器工具解决

python - Npcap 异步嗅探器

python - 如何缓存 Django Rest Framework API 调用?

python - 无法解决 'No module named Appium' 错误

python - Pandas 改变列的顺序

python - 如何将字典列表转换为以组合元组为键的多个字典?

python - 在两个 pandas DataFrame 之间执行适当的连接操作

python - 带 Altair 的简单线图

python - Laravel:致命 Python 错误:_Py_HashRandomization_Init:无法获取随机数来初始化 Python Python 运行时状态:预初始化

python - 我将如何通过计数过滤 Pandas DF 并同时对组进行平均?