Return subset/slice Pandas 数据帧基于其他数据帧的匹配列,对于列中的每个元素?

Return subset/slice of Pandas dataframe based on matching column of other dataframe, for each element in column?

所以我认为这是一个比较简单的问题:

我有一个 Pandas 数据框 (A),它有一个键列(不是 unique/will 有重复的键)

我有另一个 Pandas 数据框 (B),它有一个键列,可能有很多匹配项 entries/repeats。

所以我想要的是一堆数据帧(一个列表,或者一堆切片参数等),A中的每个键一个(不管它是否唯一)

在[错误]伪代码中:

 for each key in A:
   resultDF[] = Rows in B where B.key = key

我可以很容易地用循环迭代地做这个,但我读过你应该 slice/merge/join 整体数据帧,所以我想看看我是否能找到更好的方法这个。

连接会给我所有匹配的东西,但这并不是我要找的东西,因为我需要 each 键的结果数据框(即每个行)在 A.

谢谢!

编辑: 我试图简明扼要,但这里有一些更多的细节:

最终,我需要做的是为每一行的列中的元素生成一些简单的统计指标。

换句话说,我有一个DF,叫它A,它有r行,c列,其中一个是key。按键上可能有重复。

我想 "match" 那个键和另一个 [set of?] 数据框,返回许多匹配键的行。然后,对于那组行,我想确定某个元素(以及 std.dev、方差等)的最小值和最大值,然后确定 A 中的相应元素是否落在该范围内。

您完全正确,如果 DF A 的第 1 行和第 3 行具有相同的键——但可能有不同的元素——它们将根据相同的结果集(其范围显然不会改变)。没关系。这些不太可能大到足以成为一个问题(但如果有更好的方法,那就太好了)。

重点是我需要能够对 A 中的每个键进行 "in range" 和统计汇总计算。

同样,我可以轻松地迭代完成所有这些操作。但这似乎是 pandas 可以做的很好的事情,我刚刚开始使用它。

再次感谢!

进一步编辑

DF 看起来像这样:

df = pd.DataFrame([[1,2,3,4,1,2,3,4], [28,15,13,11,12,23,21,15],['keyA','keyB','keyC','keyD', 'keyA','keyB','keyC','keyD']]).T
df.columns = ['SEQ','VAL','KEY']

  SEQ VAL   KEY
0  1   28  keyA
1  2   15  keyB
2  3   13  keyC
3  4   11  keyD
4  1   12  keyA
5  2   23  keyB
6  3   21  keyC
7  4   15  keyD

DF的A和B都是这种格式。

我可以通过以下方式迭代得到结果集:

loop_iter = len(A) / max(A['SEQ_NUM']) 
for start in range(0, loop_iter): 
     matchA =  A.iloc[start::loop_iter, :]['KEY']

很简单。但我想我想知道我是否可以做到这一点 "inline"。此外,如果由于某种原因数字排序中断(即 SEQ 乱序),这将不起作用。似乎没有理由不明确地拆分键,对吧?所以也许我有两个问题:1)。如何迭代地拆分键(即一次访问一个 DF),以及 2)。 key上匹配的DF,如何匹配一个DF,做汇总统计等。

所以,再一次:

1).遍历 DFA,一次一个,然后获取一个密钥。 2).将键与 B 中匹配的键的 SET (matchB) 匹配 3).对 matchB 的 "values" 做一些统计,检查 val.A 是否在范围内,等等。 4).盈利!

好的,据我了解,最简单的问题是您有一个 pd.Series 个值(即 a["key"],我们称之为 keys),这对应于 pd.DataFrame 的行(df 称为 b),使得 set(b["key"]).issuperset(set(keys))。然后,您想要对 b 中的每组行应用一些函数,其中 b["key"]keys 中的值之一。

我故意无视你在提示中提到的另一个 df -- a -- 因为它似乎对问题没有任何意义,除了是密钥的来源.

无论如何,这是一种相当标准的操作 -- 它是 groupby-apply

def descriptive_func(df):
    """
    Takes a df where key is always equal and returns some summary.
    :type df: pd.DataFrame
    :rtype: pd.Series|pd.DataFrame
    """
    pass

# filter down to those rows we're interested in
valid_rows = b[b["key"].isin(set(keys))]  

# this groups by the value and applies the descriptive func to each sub df in turn
summary = valid_rows.groupby("key").apply(descriptive_func)  

groupby 对象上有一些有用的内置方法。例如,查看 valid_rows.groupby("key").sum()valid_rows.groupby("key").describe()。在幕后,这些实际上是 apply 的相似用法。 returned summary 的形状由应用的函数决定。唯一的分组依据值——b["key"] 的值——总是构成索引,但如果应用函数 return 是标量,summarySeries;如果应用的函数return是Series,那么summary由returnSeries行构成;如果应用的函数 return 是 DataFrame,则结果是多索引 DataFrame。这是 Pandas 中的一个核心模式,这里有很多值得探索的内容。