数据分组的熊猫列表

时间:2019-07-23 11:30:49

标签: pandas pandas-groupby

有一个熊猫数据帧列表,如何将它们连接在一起成为一个groupby对象,以对其进行矢量化计算?

df很相似,并且在合并后没有机会对其进行分组。

第n组:

index some_values
0     2
1     3
2     2
3     2

第n + 1组:

index some_values
6     1
7     4
8     4

我可以在列表中循环添加一个标识符,但是由于这个操作是另一个循环的一部分,因此我必须避免这个内部循环。

以另一种方式提出问题:如何向列表中DF的行中添加带有累加的标识符,以避免循环操作?

我实际上是如何到达那里的故事:

首先,我有一个布尔DF分解为Trues和组Falses

initial_df

index boolean
0     False
1     False
2     False
3     True
4     True
5     False
6     False
7     False
8     False
9     False

我用这个截图得到了我需要的groupes中的dfs

https://stackoverflow.com/questions/57132096/pandas-how-to-groupby-based-on-series-pattern

x = listing_calendar[~listing_calendar["available"]].index.values
groups = np.split(x, np.where(np.diff(x)>1)[0]+1)
grouped_dfs = [listing_calendar.iloc[gr, :] for gr in groups]

grouped_dfs[0]

    index boolean
    0     False
    1     False
    2     False

grouped_dfs[2]

    index boolean
     5     False
     6     False
     7     False
     8     False
     9     False

预期df进一步groupby

index boolean group_id
0     False     0  
1     False     0   
2     False     0
3     True      
4     True
5     False     1
6     False     1
7     False     1
8     False     1
9     False     1

或由groupby插入的grouped_dfs对象可以使用

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用类似的内容:

s=np.where(~df.boolean,df.boolean.ne(df.boolean.shift()).cumsum(),np.nan)
final=df.assign(group=pd.Series(pd.factorize(s)[0]+1).replace(0,np.nan))

   index  boolean  group
0      0    False    1.0
1      1    False    1.0
2      2    False    1.0
3      3     True    NaN
4      4     True    NaN
5      5    False    2.0
6      6    False    2.0
7      7    False    2.0
8      8    False    2.0
9      9    False    2.0

详细信息:

使用np.where()~取反,并使用df.boolean.ne(df.boolean.shift()).cumsum()将相同系列的移位值进行比较:

np.where(~df.boolean,df.boolean.ne(df.boolean.shift()).cumsum(),np.nan)
#array([ 1.,  1.,  1., nan, nan,  3.,  3.,  3.,  3.,  3.])

然后使用factorize()NaN返回-1。在此之后我们执行+1,然后用np.nan替换0。