如何在熊猫中“分组”单元格值?

时间:2020-12-27 14:59:11

标签: python pandas

我有一个如下所示的 DataFrame:

_|a |b |c
x|1 |1 |1
y|2 |2 |3
z|3 |2 |1

我希望结果是:

{
    1: [(x,a),(x,b),(x,c),(z,c)}
    2: [(y,a),(y,b),(z,b)]
    3: [(y,c),(z,a)]
}

我不在乎结果是字典还是其他数据框

4 个答案:

答案 0 :(得分:4)

您可以 stack 数据框,然后在 groupby 推导式中使用 dict 创建对应于单元格值和索引的键值对:

s = df.stack()
dct = {k: [*g.index] for k, g in s.groupby(s)}

{1: [('x', 'a'), ('x', 'b'), ('x', 'c'), ('z', 'c')],
 2: [('y', 'a'), ('y', 'b'), ('z', 'b')],
 3: [('y', 'c'), ('z', 'a')]}

答案 1 :(得分:4)

您可以在这里使用GroupBy.groups

g = df.stack()
g.groupby(g).groups
{
  1: [('x', 'a'), ('x', 'b'), ('x', 'c'), ('z', 'c')], 
  2: [('y', 'a'), ('y', 'b'), ('z', 'b')], 
  3: [('y', 'c'), ('z', 'a')]
}

答案 2 :(得分:0)

试试这个 -

#Dummy example - 
df = pd.DataFrame({'A':[1,2,3,1],'B':[1,1,3,2]}, index=['x','y','z','w'])

#Create tuples of value, index and column
l = [(i,(j,k)) for k,v in df.items() for i,j in zip(v,v.index)]

#Group them by value and create list
pd.DataFrame(l).groupby(0)[1].apply(list)
0
1    [(x, A), (w, A), (x, B), (y, B)]
2                    [(y, A), (w, B)]
3                    [(z, A), (z, B)]

答案 3 :(得分:0)

这里有一些不错的答案,我选择使用 melt,我添加这个是因为它可能有助于查看/也许其他人应该避免并突出显示其中存在的错误。

这里有一个方法:

# sample data
df = pd.DataFrame(
    {
        "a": [1, 2, 3],
        "b": [1, 2, 2],
        "c": [1, 3, 1],
    },
    index=list("xyz"),
)
cell_values = {}
for cell_value, g in df.reset_index().melt(id_vars="index").groupby("value"):
    cell_values[cell_value] = set(g[["index", "variable"]].apply(tuple, axis=1))

我假设只需要唯一的条目,因此使用了 set()