Python Pandas groupby并加入

时间:2018-09-28 11:53:04

标签: pandas pandas-groupby difference

我是python熊猫的新手,在任何较旧的文章中都找不到解决我问题的答案。

我有一个简单的数据框,看起来像这样:

dfA ={'stop':[1,2,3,4,5,1610,1611,1612,1613,1614,2915,...]
      'seq':[B, B, D, A, C, C, A, B, A, C, A,...] }

现在,我要合并每个组中的'seq'值,其中'stop'中的下一个值和上一个值之间的差等于1。当该差很高时(例如5和1610),下一个是群集开始,依此类推。

我需要将每个群集中的所有值写入单独的行:

0 BBDAC   #join'stop' cluster 1-5  
1 CABAC   #join'stop' cluster 1610-1614

2 A....   #join'stop' cluster 2015 - ...
etc...

我当前的代码得到的是:

True   BDACABAC...
False  BCA...

针对整个巨大的数据框。

我了解将其合并的逻辑,这种逻辑满足了我指定的条件(不完美,集群边缘松散),但是如果我能将其加入并以某种方式正确地分成多个集群,我将无所适从,并非数据框的所有行。

请在下面查看我的代码:

dfB = dfA.groupby((dfA.stop - dfA.stop.shift(1) == 1))['seq'].apply(lambda x: ''.join(x)).reset_index()

请帮助。

P.S。我也尝试过使用diff()进行各种组合,但这都没有帮助。我不确定groupby是否也适用于此解决方案。请指教!

dfC = dfA.groupby((dfA['stop'].diff(periods=1)))['seq'].apply(lambda x: ''.join(x)).reset_index() 

这以某种方式将数据帧分成了类似簇的较小块,但我不了解其实现方式背后的传统,而且我知道结果没有意义,也不是我想要得到的。

2 个答案:

答案 0 :(得分:0)

我认为您需要创建助手Series进行分组:

g = dfA['stop'].diff().ne(1).cumsum()
dfC = dfA.groupby(g)['seq'].apply(''.join).reset_index()
print (dfC)
   stop    seq
0     1  BBDAC
1     2  CABAC
2     3      A

详细信息

首先通过diff获得差异:

print (dfA['stop'].diff())
0        NaN
1        1.0
2        1.0
3        1.0
4        1.0
5     1605.0
6        1.0
7        1.0
8        1.0
9        1.0
10    1301.0
Name: stop, dtype: float64

ne (!=)比较组的第一个值:

print (dfA['stop'].diff().ne(1))
0      True
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8     False
9     False
10     True
Name: stop, dtype: bool

Asn上次通过cumsum创建组:

print (dfA['stop'].diff().ne(1).cumsum())
0     1
1     1
2     1
3     1
4     1
5     2
6     2
7     2
8     2
9     2
10    3
Name: stop, dtype: int32

答案 1 :(得分:0)

我只是想通了。 我设法将“停止”的值四舍五入到最接近的100,并将其分配为新列。 然后我之前的代码正在工作。 不过,非常感谢您的快速回答。

dfA ['new_val'] =(dfA ['stop'] / 100).astype(int)* 100