我有一个如下所示的 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)]
}
我不在乎结果是字典还是其他数据框
答案 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()
。