【问题标题】:Compute a new dataframe following specific set of rules按照特定的规则集计算一个新的数据帧
【发布时间】:2018-12-23 03:11:34
【问题描述】:

我有一个包含 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

现在,我想计算一个具有以下属性的新数据框(数据框 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,如果跨行column_B 和column_C 中的两个对应值 匹配

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

val == 3,如果跨行只有对应的值在column_C匹配

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

我们也可以将问题解释为在 Pandas 数据框中找到一对行索引,其中 column_B 和 column_C 中的值相同。 示例:Row[0] 和 row[1] 在 column_B 和 column_C 中具有相同的值

【问题讨论】:

  • val == 1,如果 column_B 和 column_C 中的两个值都匹配您正在寻找匹配的基础,因为框架具有不同的 dTypes
  • 对应的值匹配,比如例子中给定的对应值在行对(0,1)和(2,3)匹配中的column_B和column_C
  • 对不起,还是不明白。
  • Dataframe 1 是基本数据帧,id 列作为每一行的标识符。现在我需要找到成对的 ID,其中 column_B 和 Column_C 中的相应值匹配。在上面的示例中,row[0] 和 row[1] 在 column_B 和 column_C 中具有相同的对应值,因此,我在数据帧 2 中创建了一个新行,例如 (123,7,1)
  • column_B和column_C的对应值如何匹配?一个是 int 另一个是字符串。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

我的方法如下:

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 times 1 plus if-C-match times 2") - 但这只是一些简单的运算符及其顺序的问题。

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多