如何在pandas数据帧的连续相似值上使用groupby?

时间:2017-06-13 18:20:00

标签: python pandas

假设我们有一个名为df的数据框:

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]

我希望分离基于相似和连续的数据。

1 个答案:

答案 0 :(得分:3)

Series groupby cumsumshift移位列A创建Best way to access the Nth line of csv file

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']}