Pandas:确定从唯一行到原始数据帧的映射

Posted

技术标签:

【中文标题】Pandas:确定从唯一行到原始数据帧的映射【英文标题】:Pandas : determine mapping from unique rows to original dataframe 【发布时间】:2015-05-15 05:32:08 【问题描述】:

给定以下输入:

In [18]: input
Out[18]:
   1  2   3  4
0  1  5   9  1
1  2  6  10  2
2  1  5   9  1
3  1  5   9  1

In [26]: df = input.drop_duplicates()
Out[26]:
   1  2   3  4
0  1  5   9  1
1  2  6  10  2

我将如何获取一个数组,该数组具有来自子集的行的索引,例如:

resultant = [0, 1, 0, 0] 

即这里的'1'基本上是说明(输入中的行[1])==(df中的行[1])。由于唯一行的数量将少于“结果”中的多个值,这将等同于 df 中的相似值。即 (row[k] in input == row[k+N] in input) == (row[1] in df) 可能是一种情况。

我正在寻找来自 input:df 的实际行号映射。

虽然这个例子在我的例子中是微不足道的,但我有大量删除的映射可能映射到一个索引作为例子。

我为什么要这个?我正在训练一个目标序列不唯一的自动编码器类型系统。

【问题讨论】:

我很困惑。你的意思是重复行的索引被删除了吗? 删除的数据框中的索引,其中行等于输入中的行。即:df中的第0行等于输入中的第0行。 为了清楚起见更新了问题 在原始问题中添加了更多信息。这有帮助吗?我不相信这会起作用,因为可能有多个重复 哦,我明白了。 0/1 让我失望了。我以为你的意思是布尔值,但它只是索引号...... 【参考方案1】:

一种方法是在所有列上将其视为groupby

>> df.groupby(list(df.columns)).groups
(1, 5, 9, 1): [0, 2, 3], (2, 6, 10, 2): [1]

另一种是sort,然后进行比较,理论上效率较低,但在某些情况下可能会更快,并且绝对更容易更容错:

>>> ds = df.sort(list(df.columns))
>>> eqs = (ds != ds.shift()).all(axis=1).cumsum()
>>> ds.index.groupby(eqs)
1: [0, 2, 3], 2: [1]

这对我来说似乎是正确的数据结构,但如果你真的想要一个带有组 ID 的数组,那也很容易,例如

>>> eqs.sort_index() - 1
0    0
1    1
2    0
3    0
dtype: int64

【讨论】:

这似乎比我的建议更多熊猫和更快【参考方案2】:

这台电脑上没有安装 pandas,但我认为你可以使用 df.iterrows() 之类的:

def find_matching_row(row, df_slimmed):
    for index, slimmed_row in df_slimmed.iterrows():
        if slimmed_row.equals(row[slimmed_row.columns]):
            return index

def rows_mappings(df, df_slimmed):
    for _, row in df.iterrows():
        yield find_matching_row(row, df_slimmed)

list(rows_mappings(df, input))

如果您有兴趣在您的示例中生成resultant 列表,我不太理解您推理的后半部分。

【讨论】:

这绝对有效(只需将 == 更改为 .equals() )。有没有更优化的方法呢? 现在应该修复错误并允许删除列。为了获得最佳效果,如果可能,请在***.com/questions/10729210/… 跟踪

以上是关于Pandas:确定从唯一行到原始数据帧的映射的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jquery 对象映射中过滤唯一的数据属性值

使用两个数据帧计算最终值pandas

如何有效地迭代 Pandas 数据帧的连续块

熊猫,比较不同长度的数据帧的值*范围*并写回原始 df

从 Pandas 数据帧到 Spark 数据帧的转换需要大量时间

使用 CSS3 动画确定丢帧的原因