所以我认为这是一个相对简单的问题:
我有一个Pandas数据框(A),它有一个键列(不是唯一的/会有重复的键)
我有另一个Pandas数据框(B),它有一个键列,可能有许多匹配的条目/重复。
所以我喜欢的是一堆数据帧(一个列表,或一堆切片参数等),一个用于A中的每个键(无论它是否唯一) )
在[bad]伪代码中:
for each key in A:
resultDF[] = Rows in B where B.key = key
我可以使用循环轻松地迭代执行此操作,但我已经读过你应该整体切片/合并/加入数据框,所以我试图看看我是否能找到一个更好的方法。
联接会给我所有匹配的东西,但这并不是我正在寻找的东西,因为我需要为每个键生成一个数据帧(即每一行都在A。
谢谢!
修改 我试图简短,但这里有更多细节:
最后,我需要做的是为每行的列中的元素生成一些简单的统计指标。
换句话说,我有一个DF,称之为A,它有一个r行,有c列,其中一列是键。钥匙上可能会有重复。
我想"匹配"该键与另一个[set of?]数据帧一起返回,然而返回的行与键相匹配。然后,对于那组行,我想要确定某个元素的最小值和最大值(以及标准变量,方差等),然后确定A中的相应元素是否在该范围内。
你是绝对正确的,如果DF A的第1行和第3行具有相同的密钥 - 但可能是不同的元素 - 它们可能会针对相同的结果进行检查设定(其范围明显不会改变)。没关系。这些问题可能永远不会成为一个问题(但如果有更好的方法,那就太棒了。)
重点是我需要能够在范围内做到#34;和A中的EACH密钥的统计汇总计算。
同样,我可以轻松地迭代地完成所有这些操作。但这似乎是熊猫可以做得很好的事情,我只是开始使用它。
再次感谢!
进一步编辑
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的A和B都是这种格式。
我可以通过以下方式迭代得到结果集:
loop_iter = len(A) / max(A['SEQ_NUM'])
for start in range(0, loop_iter):
matchA = A.iloc[start::loop_iter, :]['KEY']
这很简单。但我想我想知道我是否可以做到这一点"内联"。此外,如果由于某种原因数字排序中断(即SEQ失序),这将不起作用。似乎没有理由不明确地拆分键,对吧?所以也许我有两个问题:1)。如何迭代地拆分密钥(即一次访问一行DF),以及2)。如何匹配DF并在与密钥匹配的DF上执行汇总统计等。
所以,再一次:
1)。迭代DF A,一次一个,抓一把钥匙。 2)。将密钥与匹配的B中的密钥的SET(matchB)匹配 3)。做一些关于"值的统计数据"匹配B,检查val.A是否在范围内等。 4)。利润!
答案 0 :(得分:0)
好的,根据我的理解,最简单的问题是你有一个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
的类似用法。返回的summary
的形状由应用的函数确定。唯一的分组值 - b["key"]
的值 - 始终构成索引,但如果应用的函数返回标量,则summary
是Series
;如果应用函数返回Series
,则summary
由返回Series
组成行;如果应用函数返回DataFrame
,则结果为多索引DataFrame
。这是熊猫的核心模式,这里有很多值得探讨的事情。