繁体   English   中英

使用多变量条件比较数据框

Compare Dataframes using multivariable conditions

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

使用合并查找列的值时遇到麻烦。 我有两个数据框:

df条件

A  |  B  |  C  |  D  |  E  | F |
A1 | B1  |     |     |     | F1|
A2 | B2  |     |     |     | F2|
A3 | B3  |     |  D3 |     | F3|
A4 | B4  |     |  D4 |  E4 | F4|

df结果

A  |  B  |  C  |  D  |  E  | G  | H  | 
A1 | B1  |  C1 |  D1 |  E1 | G1 | H1 |
A2 | B2  |  C2 |  D2 |  E2 | G2 | H2 |
A3 | B3  |  C3 |  D3 |  E3 | G3 | H3 |
A4 | B4  |  C4 |  D4 |  E4 | G4 | H4 |

F列的参数值包含在merge()中,因此我想要df结果

我正在使用代码:

df Result = pd.merge(df Result, df Conditions[[A,B,C,D,E,F]], on = [A,B,C,D,E], how = 'left')

当前,结果是仅获得条件列数量最多的F列,但不会评估所有条件。

A  |  B  |  C  |  D  |  E  | G  | H  | F |
A1 | B1  |  C1 |  D1 |  E1 | G1 | H1 |   |
A2 | B2  |  C2 |  D2 |  E2 | G2 | H2 |   |
A3 | B3  |  C3 |  D3 |  E3 | G3 | H3 |   |
A4 | B4  |  C4 |  D4 |  E4 | G4 | H4 | F4|

我怎样才能做到这一点?

1 个回复

我认为一种方法可以通过合并使用多个df.update() 基本思想是为多个列的None值创建多个wildcards数据框

df_Conditions = pd.DataFrame(columns=['A', 'B', 'C', 'D', 'E', 'F'],
                             data=[['A1', 'B1', None, None, None, 'F1'],
                                   ['A2', 'B2', None, None, None, 'F2'],
                                   ['A3', 'B3', None, 'D3', None, 'F3'],
                                   ['A4', 'B4', None, 'D4', 'E4', 'F4'],
                                   ])

df_Result = pd.DataFrame(columns=['A', 'B', 'C', 'D', 'E', 'G', 'H'],
                         data=[['A1', 'B1', 'C1', 'D1', 'E1', 'G1', 'H1'],
                               ['A2', 'B2', 'C2', 'D2', 'E2', 'G2', 'H2'],
                               ['A3', 'B3', 'C3', 'D3', 'E3', 'G3', 'H3'],
                               ['A4', 'B4', 'C4', 'D4', 'E4', 'G4', 'H4'],
                               ])

首先像您所做的那样合并,它应该为您提供一个额外的空column F

res = pd.merge(df_Result, df_Conditions, on=['A', 'B', 'C', 'D', 'E'], how='left')
res
Out[8]: 
    A   B   C   D   E   G   H    F
0  A1  B1  C1  D1  E1  G1  H1  NaN
1  A2  B2  C2  D2  E2  G2  H2  NaN
2  A3  B3  C3  D3  E3  G3  H3  NaN
3  A4  B4  C4  D4  E4  G4  H4  NaN

创建通配符数据df_Conditions作为df_Conditions的子数据df_Conditions

wildcards_C = df_Conditions[df_Conditions['C'].isnull()].dropna(axis=1, how='all')
wildcards_C
Out[10]: 
    A   B     D     E   F
0  A1  B1  None  None  F1
1  A2  B2  None  None  F2
2  A3  B3    D3  None  F3
3  A4  B4    D4    E4  F4

将其与df_Result合并并更新res上的值

res.update(df_Result.merge(wildcards_C, how='left'), overwrite=False)
res
Out[12]: 
    A   B   C   D   E   G   H    F
0  A1  B1  C1  D1  E1  G1  H1  NaN
1  A2  B2  C2  D2  E2  G2  H2  NaN
2  A3  B3  C3  D3  E3  G3  H3  NaN
3  A4  B4  C4  D4  E4  G4  H4   F4

当列A,B,D,E上的值匹配时,它将更新res数据帧上的列F。 对条件列E重复相同的操作

wildcards_E = df_Conditions[df_Conditions['E'].isnull()].dropna(axis=1, how='all')
res.update(df_Result.merge(wildcards_E, how='left'), overwrite=False)
res
Out[6]: 
    A   B   C   D   E   G   H    F
0  A1  B1  C1  D1  E1  G1  H1  NaN
1  A2  B2  C2  D2  E2  G2  H2  NaN
2  A3  B3  C3  D3  E3  G3  H3   F3
3  A4  B4  C4  D4  E4  G4  H4   F4

最后,对条件列D重复相同的操作

wildcards_D = df_Conditions[df_Conditions['D'].isnull()].dropna(axis=1, how='all')
res.update(df_Result.merge(wildcards_D, how='left'), overwrite=False)
res
Out[6]: 
    A   B   C   D   E   G   H   F
0  A1  B1  C1  D1  E1  G1  H1  F1
1  A2  B2  C2  D2  E2  G2  H2  F2
2  A3  B3  C3  D3  E3  G3  H3  F3
3  A4  B4  C4  D4  E4  G4  H4  F4

出于演示目的,我没有将重复进行循环分组。

这里的一个缺点是,您必须自己分析“通配符”的顺序(当前策略):使通配符最少的列(即D列)保持尽可能长的时间。

1 Python:根据两个条件比较数据框

我有以下两个数据框: DF1: DF2: 现在,我想根据日期和ID提取df1中而不是df2中的观测值列表。 结果应如下所示: 我知道如何用isin这样的命令将列与列表进行比较: 但是,这只会根据列ID比较两个数据帧。 因为id可能位于df1和df2中 ...

2 使用KNN与数据帧进行比较

我有以下两个数据集: 基于这些data.frames我想检查哪个类别df更接近:类别A或B. 因此我做了以下事情: 使所有data.frame数字化 计算欧氏距离 接下来我想在all data.frame中查找值 但是,如果我尝试这个 我应该打 ...

3 使用具有多变量函数的outer()

假设你有一个函数f<- function(x,y,z) { ... } 。 你会如何将常数传递给一个参数,但让其他参数变化? 换句话说,我想做这样的事情: 此代码没有评估,但有没有办法做到这一点? ...

2012-08-14 11:10:10 2 3874   r
4 R通过多个条件与两个数据帧进行比较以提取行

我有两个数据框: 想从 x 中提取行,条件如下: 结果应该是: x: abc 1 2 2 只有 x 匹配中的第 2 行。 我试过了: 至少匹配前两个条件,但不起作用,结果为空。 什么是合适的处理方式? 请帮忙。 ...

2020-03-06 15:26:15 2 151   r
6 根据多行条件比较两个不同的数据帧

我有两个数据框,其中包含有关同一患者的不同信息。 我需要使用数据帧 1 来过滤数据帧 2,以便数据帧 2 将仅保留其整数患者行值,如果df_1中存在相同chromosome 、 strand 、 elementloc和patient的整数值。 如果 df_1 中有NaN值,我想将NaN放在df_2中 ...

7 在多个条件下比较两个不同大小的数据框

只要DF1中的A,B,C和D列匹配DF2,则打印“ True”(在DF1中的新列“ Test”中),否则打印“ False”。 我的代码: 结果: 问题: 1.代码很慢。 2.如果必须测试更多列(例如15列),则很难扩展代码。 编辑:问题寻找答案: ...

8 如何使用列索引比较两个数据框?

我正在使用 INSERT OVERWRITE LOCAL DIRECTORY 命令将 hdfs 查询输出导出到 csv 文件中。 由于这会导出没有标题的数据。 我从 Oracle 输出中获得了另一个带有文件头的数据帧,我需要将其与 hdfs 输出进​​行比较。 df1 = pd.read_csv(' ...

9 使用熊猫比较两个数据框的列值

我是python的新手,所以请放轻松。 我一直在寻找类似的线程,但无法为我的问题找到一个巧妙的解决方案: 我想比较两个数据框的列值,并将值放在新数据框中不同的地方,我的数据框在下面并且长度不同(即行数)。 我想比较每个 SKU 的状态: 比较 df2 和 df1 我想关注 df3 我知道它 ...

10 使用R中的折线图比较两个数据框

my_query数据框1 数据框2 我想通过在r作图来比较这两个。能否在这里提出建议? 注意:我尝试了不同的方法,但是没有运气 ...

2018-06-26 17:50:44 2 44   r
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM