我该如何在 pandas 中按单元格值进行分组?

4
我有一个类似于这样的DataFrame:
_|a |b |c
x|1 |1 |1
y|2 |2 |3
z|3 |2 |1

I want the result to be:

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

我不在乎结果是字典还是另一个数据框。
4个回答

4
你可以使用stack函数将数据框转换为堆叠格式,然后在字典推导式中使用groupby函数创建键值对,对应于单元格的值和索引:
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')]}

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
很棒的分组想法..节日快乐!保持安全和健康 :) - Shubham Sharma
1
谢谢...节日快乐,圣诞快乐...TBH我最初尝试了与你相同的方法(点赞),然后转而使用了分组。 :P - Ch3steR

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()


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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接