是否可以将python pandas中的groupby应用于已分组的对象?

时间:2019-05-09 11:34:22

标签: python pandas dataframe group-by

我有一个数据集,如下所示:

  File_no    A   B       Date     Batch  State   

0    1       2    3    23-1-2019    2      3
1    2       7    6    23-1-2019    2      4
2    3       9    2    24-1-2019    1      2
3    5       6    3    24-1-2019    2      3
4    6       4    3    24-1-2019    1      4
5    8       2    3    25-1-2019    1      4

我想根据日期和批次对数据列“ A”和“ B”进行分组。然后根据文件编号的顺序对这些列的行进行移位。例如,在上述数据框中,文件4没有丢失。

我能够实现平移功能,但是我不能单独为每个组做到这一点。

例如:6和8个文件不是按顺序排列的,但是它们来自不同的日期。因此,不应执行移位,因为它缺少序列。

diff = data['File_no'].diff().ne(1).cumsum() 

grouped=data.groupby(['Date','Batch'])

grouped.apply(lambda data: data.groupby(diff)['A','B'].shift())

每当缺少序列并且不考虑组时,这都会执行移位。

预期输出:



  File_no    A   B       Date     Batch  State   

0    1       Nan  Nan    23-1-2019    2      3
1    2       2    3      23-1-2019    2      4
2    3       9    2      24-1-2019    1      2
3    5       Nan  Nan    24-1-2019    2      3
4    6       6    3      24-1-2019    1      4
5    8       2    3      25-1-2019    1      4

1 个答案:

答案 0 :(得分:0)

我认为您可以将具有系列的列传递给一个groupby

diff = data['File_no'].diff().ne(1).cumsum() 
data[['A','B']] = data.groupby(['Date','Batch',diff])['A','B'].shift()
print (data)

   File_no    A    B       Date  Batch  State
0        1  NaN  NaN  23-1-2019      2      3
1        2  2.0  3.0  23-1-2019      2      4
2        3  NaN  NaN  24-1-2019      1      2
3        5  NaN  NaN  24-1-2019      2      3
4        6  NaN  NaN  24-1-2019      1      4
4        8  NaN  NaN  25-1-2019      1      4

编辑:

r = np.arange(data['File_no'].min(), data['File_no'].max() + 1)
data = data.set_index('File_no').reindex(r)

diff = data.index.to_series().diff().ne(1).cumsum() 
data[['A','B']] = data.groupby(['Date','Batch',diff])['A','B'].shift()
data = data.dropna(how='all').reset_index()
print (data)
   File_no    A    B       Date  Batch  State
0        1  NaN  NaN  23-1-2019    2.0    3.0
1        2  2.0  3.0  23-1-2019    2.0    4.0
2        3  NaN  NaN  24-1-2019    1.0    2.0
3        5  NaN  NaN  24-1-2019    2.0    3.0
4        6  9.0  2.0  24-1-2019    1.0    4.0
5        8  NaN  NaN  25-1-2019    1.0    4.0