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:确定从唯一行到原始数据帧的映射的主要内容,如果未能解决你的问题,请参考以下文章