我有两个数据框:
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
中的所有行与匹配fruit
至df2
和 values
之间min
和max
.
我正在尝试这样的事情:
df.loc[df['fruit'].isin(df2['fruit'])].loc[df['values'].between(df2['min'], df2['max'])]
但可以预见的是,这会返回一个 ValueError: Can only Comparesamely-labeled Series objects.
编辑:您会注意到 fruit
在 df2
中重复。这是故意的。我仍在尝试抓取 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
如果我们不希望输出中包含 min
和 max
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/