Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按照一组特定的规则计算一个新的数据帧_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 按照一组特定的规则计算一个新的数据帧

Python 按照一组特定的规则计算一个新的数据帧,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个4列的数据框 数据帧1: column_A column_B column_C id 0 1 1 anna 123 1 2 1 anna 7 2 30 2 bob 42 3 20 2 bob 12 4 10 2 charlie 1 5 100 3

我有一个4列的数据框

数据帧1:

 column_A column_B  column_C   id  
0       1       1      anna    123
1       2       1      anna      7
2      30       2      bob      42
3      20       2      bob      12
4      10       2      charlie   1
5     100       3      charlie   2
现在,我想计算一个具有以下属性的新数据帧(Dataframe 2

     id_1    id_2       val
0     123       7         1
1      42      12         1
2      42       1         2
3      12       1         2 
4       1       2         3
val==1,如果跨行列B和列C中的两个对应值都匹配

val==2,如果跨行只有列中的对应值匹配

val==3,如果跨行只有列C中的对应值匹配

我当前的实现是O(N^2)。考虑到数据帧很大,我是否可以使用一些并行化来加快处理速度

我们还可以将这个问题解释为在数据帧中查找行索引对,其中列B、列C中的值相同。
示例:行[0]和行[1]在列_B和列_C中具有相同的值

我的方法如下:

import numpy as np
import itertools as it

df2 = pd.DataFrame(np.array(list(it.combinations(df.id, 2))), columns=['id_1', 'id_2'])

    id_1  id_2
0    123     7
1    123    42
2    123    12
3    123     1
4    123     2
5      7    42
6      7    12
7      7     1
8      7     2
9     42    12
10    42     1
11    42     2
12    12     1
13    12     2
14     1     2

    rules = lambda x: abs(
     (df[df.id==x[0]].column_C.values == df[df.id==x[1]].column_C.values).all()*3 -
     (df[df.id==x[0]].column_B.values == df[df.id==x[1]].column_B.values).all()*2)

df2['val'] = df2.apply(rules, axis=1)

df2[df2.val>0]
   id_1  id_2  val
0   123     7    1
1    42    12    1
2    42     1    2
3    12     1    2
4     1     2    3
其思想是计算“if-C-match乘以3减去if-B-match乘以2”的绝对值。
即:
两者都匹配:
| 3-2 |=1

只有C:
| 3-0 |=3

仅B:
| 0-2 |=2

不匹配:
|0-0 |=0


如果您要求一个列匹配为val=1,另一个列匹配为val=2,则会更清楚,因此总和为1+2=3,那么lambda公式会更简单(“if-B-match乘以1加上if-C-match乘以2”)——但这只是一些简单运算符及其顺序的问题。

val==1,如果列_B和列_C中的两个值都匹配您要匹配的基础,因为帧具有不同的DTypeScorresponsed值匹配,例如在示例中,列_B和列_C中的对应值在行对(0,1)和(2,3)中匹配抱歉,我还是不明白。Dataframe 1是基础Dataframe,id列作为每行的标识符。现在我需要找到列B和列C中对应值匹配的Id对。在上面的示例中,行[0]和行[1]在列_B和列_C中具有相同的对应值,因此,我在数据帧2中创建了一个新行,例如(123,7,1)列_B和列_C的对应值如何匹配?一个是int,另一个是string。