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 是标量,summary
是 Series
;如果应用的函数return是Series
,那么summary
由returnSeries
行构成;如果应用的函数 return 是 DataFrame
,则结果是多索引 DataFrame
。这是 Pandas 中的一个核心模式,这里有很多值得探索的内容。
所以我认为这是一个比较简单的问题:
我有一个 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 是标量,summary
是 Series
;如果应用的函数return是Series
,那么summary
由returnSeries
行构成;如果应用的函数 return 是 DataFrame
,则结果是多索引 DataFrame
。这是 Pandas 中的一个核心模式,这里有很多值得探索的内容。