2017-06-13 27 views
1

假設我們有一個數據幀稱爲DF:如何在pandas數據框的連續相似值上使用groupby?

A B 
1 a 
1 b 
1 c 
2 d 
2 e 
1 f 
1 g 

我想使用GROUPBY創建以下:

1: [a,b,c] 
2: [d,e] 
1: [f,g] 

目前,如果我用的東西上的

{k: list(v) for k,v in df.groupby("A")["B"]} 

我得到

1: [a,b,c,f,g] 
2: [d,e] 

我想分離是基於數據是相似和連續的。

回答

3

您可以通過groupbySeries是移柱Acumsum創建由shift

print (df["A"].ne(df["A"].shift()).cumsum()) 
0 1 
1 1 
2 1 
3 2 
4 2 
5 3 
6 3 
Name: A, dtype: int32 

df = df["B"].groupby(df["A"].ne(df["A"].shift()).cumsum()).apply(list).reset_index() 
print (df) 
    A   B 
0 1 [a, b, c] 
1 2  [d, e] 
2 3  [f, g] 

對於dict

d = {k: list(v) for k,v in df['B'].groupby(df["A"].ne(df["A"].shift()).cumsum())} 
print (d) 
{1: ['a', 'b', 'c'], 2: ['d', 'e'], 3: ['f', 'g']} 

d = df["B"].groupby(df["A"].ne(df["A"].shift()).cumsum()).apply(list).to_dict() 
print (d) 
{1: ['a', 'b', 'c'], 2: ['d', 'e'], 3: ['f', 'g']} 

EDIT1:

df = df["B"].groupby([df['A'], df["A"].ne(df["A"].shift()).cumsum()]).apply(list) 
df = df.groupby(level=0).apply(lambda x: x.tolist() if len(x) > 1 else x.iat[0]).to_dict() 
print (df) 
{1: [['a', 'b', 'c'], ['f', 'g']], 2: ['d', 'e']} 
+0

不錯!十分優雅! – Ding

+0

@丁 - 謝謝。 – jezrael

+0

謝謝 有沒有辦法修改和使用 {k:list(v)for k,v in df.groupby(「A」)[「B」]} structure? 另外,我想它顯示爲 'A B 1 [A,B,C] 2 [d,E] 1 [F.G]' (最後一個元素爲1,不3)。再次感謝。 – Abhi

相關問題