当两个数据帧的列和索引完全相同时,如何通过匹配另一个数据帧的条件来对一个数据帧的数据进行分组?

我有一个数据框,像这样说df1:

    1   2   3   4   
1   5   2   3   14  
2   20  18  12  16  
3   13  21  32  4  
4   17  25  32  13 

和另一个数据框,像这样说df2:

    1   2   3   4 
1   13  19  45  56 
2   45  54  28  31
3   33  45  32  9
4   23  65  14  15

我要填充第三个数据框,例如df3:

Lower   Upper   Val
0       5       73
5       10      13
10      15      132
15      20      ...
20      25      ...
25      30      ...

现在,要填充df3中的“ val”列,代码应首先获取df1中位于df3中给定限制之间的单元格位置,然后添加df2而不是df1的相应值。

我可以使用嵌套循环来做到这一点,但我需要一些没有循环的东西。

谢谢。

HEDEWEN830 回答:当两个数据帧的列和索引完全相同时,如何通过匹配另一个数据帧的条件来对一个数据帧的数据进行分组?

LowerUpper列创建IntervalIndex.from_arrays的想法。然后通过DataFrame.stack重塑第一和第二个DataFrame,并首先使用cut进行合并,用于sum聚合的组:

df3.index = pd.IntervalIndex.from_arrays(df3['Lower'],df3['Upper'],closed='left')
print (df3.index)
IntervalIndex([[0,5),[5,10),[10,15),[15,20),[20,25),[25,30)],closed='left',dtype='interval[int64]')

df3['Val'] = df2.stack().groupby(pd.cut(df1.stack(),df3.index)).sum()
print (df3)
          Lower  Upper  Val
[0,5)        0      5   73
[5,10)       5     10   13
[10,15)     10     15  132
[15,20)     15     20  108
[20,25)     20     25   90
[25,30)     25     30   65

最后创建默认索引:

df3 = df3.reset_index(drop=True)
print (df3)
   Lower  Upper  Val
0      0      5   73
1      5     10   13
2     10     15  132
3     15     20  108
4     20     25   90
5     25     30   65

详细信息

print (df1.stack())
1  1     5
   2     2
   3     3
   4    14
2  1    20
   2    18
   3    12
   4    16
3  1    13
   2    21
   3    32
   4     4
4  1    17
   2    25
   3    32
   4    13
dtype: int64

print (pd.cut(df1.stack(),df3.index))
1  1     [5.0,10.0)
   2      [0.0,5.0)
   3      [0.0,5.0)
   4    [10.0,15.0)
2  1    [20.0,25.0)
   2    [15.0,20.0)
   3    [10.0,15.0)
   4    [15.0,20.0)
3  1    [10.0,15.0)
   2    [20.0,25.0)
   3             NaN
   4      [0.0,5.0)
4  1    [15.0,20.0)
   2    [25.0,30.0)
   3             NaN
   4    [10.0,15.0)
dtype: category
Categories (6,interval[int64]): [[0,5) < [5,10) < [10,15) < [15,20) < [20,25) < [25,30)]

print (df2.stack())
1  1    13
   2    19
   3    45
   4    56
2  1    45
   2    54
   3    28
   4    31
3  1    33
   2    45
   3    32
   4     9
4  1    23
   2    65
   3    14
   4    15
dtype: int64
本文链接:https://www.f2er.com/3145120.html

大家都在问