根据列中其他元素的匹配列返回Pandas数据帧的子集/切片?

时间:2015-05-08 08:02:56

标签: python pandas merge dataframe

所以我认为这是一个相对简单的问题:

我有一个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)。利润!

1 个答案:

答案 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"]的值 - 始终构成索引,但如果应用的函数返回标量,则summarySeries;如果应用函数返回Series,则summary由返回Series组成行;如果应用函数返回DataFrame,则结果为多索引DataFrame。这是熊猫的核心模式,这里有很多值得探讨的事情。