查找行之间的绝对差异并将差异与其他行进行比较

Posted

技术标签:

【中文标题】查找行之间的绝对差异并将差异与其他行进行比较【英文标题】:Finding absolute difference between rows and comparing the difference with other rows 【发布时间】:2019-12-31 08:24:39 【问题描述】:

我有这个数据框。

df = pd.DataFrame('userId': [10,20,10,20,10,20,60,90,60,90,60,90,30,40,30,40,30,40,50,60,50,60,50,60],
                   'movieId': [500,500,800,800,700,700,1100,1100,1900,1900,2000,2000,1600,1600,1901,1901,3000,3000,3025,3025,4000,4000,500,500],  
                   'ratings': [3.5,4.5,2.0,5.0,3.0,1.5,1.5,4.5,2.5,4.5,4.0,5.0,4.0,1.5,4.5,4.5,3.5,4.5,3.0,5.0,4.0,1.5,3.5,5])

我已将此数据帧转换为不同的块。每 6 行创建一个新块。

After creating chunks it looks like this

df
   userId  movieId  ratings
0      10      500      3.5
1      20      500      4.5
2      10      800      2.0
3      20      800      5.0
4      10      700      4.0
5      20      700      1.5
    userId  movieId  ratings
6       60     1100      3.5
7       90     1100      4.5
8       60     1900      3.5
9       90     1900      4.5
10      60     2000      2.0
11      90     2000      5.0
    userId  movieId  ratings
12      30     1600      4.0
13      40     1600      1.5
14      30     1901      3.5
15      40     1901      4.5
16      30     3000      3.5
17      40     3000      4.5
    userId  movieId  ratings
18      50     3025      2.0
19      60     3025      5.0
20      50     4000      4.0
21      60     4000      1.5
22      50      500      3.5
23      60      500      4.5

我想做的是: 1. 取两个用户看同一部电影的绝对差值(每对用户看了三部电影)。 2.取前两部电影的差异平均值,然后将其与第三部电影的差异进行比较。 如果第三部电影的差异小于前两部电影的平均值,则为正,否则为负。例如,在第一个块 diff b/w 中,第一部电影是 1,下一个是 3(平均 diff 是 2)。对于第三对 diff 是 2.5 (diff > avg),它应该给出否定的结果。 3. 对数据帧中的每个块都这样做。

positive_counter = [] 
negative_counter = []

numberOfUsers = 2
numberOfMovies = 3
usersLength = numberOfUsers*numberOfMovies

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

def finding_rating(df):
     for i in chunker(data,usersLength):

        df['diff'] = df.groupby('movieId')['ratings'].diff().abs()
        #code




【问题讨论】:

【参考方案1】:

对于一个块,你可以应用这个:

dfchunk                                                                                                              
   userId  movieId  ratings
0      10      500      3.5
1      20      500      4.5
2      10      800      2.0
3      20      800      5.0
4      10      700      4.0
5      20      700      1.5

r=dfchunk.pivot(index="movieId",columns="userId")                                                                    

        ratings     
userId       10   20
movieId             
500         3.5  4.5
700         4.0  1.5
800         2.0  5.0

r.columns=["u1","u2"]                                                                                                

r["drate"]=r.u1.sub(r.u2).abs()                                                                                      

          u1   u2  drate
movieId                 
500      3.5  4.5    1.0
700      4.0  1.5    2.5
800      2.0  5.0    3.0

v= r.drate.iloc[:-1].mean()-r.drate.iloc[-1]                                                                            
-1.25

编辑:

if v<0:
   negative_counter.append(v)
else:
   positive_counter.append(v)

【讨论】:

我可以将来自v= r.drate.iloc[:-1].mean()-r.drate.iloc[-1] 的所有结果附加到一个列表中。我正在尝试,但遇到了一些错误。

以上是关于查找行之间的绝对差异并将差异与其他行进行比较的主要内容,如果未能解决你的问题,请参考以下文章

创建一个差异矩阵比较R数据框中所有行之间的差异

Python比较文件差异,difflib类库的使用

Linux命令比较文件差异 diff

如何比较两组数据的差异性?

SQL查找上一行和当前行之间的差异

如何比较每一列并单独显示差异