通过python中的多个条件合并不同数量的行和列

id3*_*678 5 merge join left-join python-3.x pandas

更新的问题:为什么它不合并a_datea_para_consa_menta_le。这些附加为没有值的列,但在原始数据集中它们有值。

这是数据集的样子

         connector   type   q_text   a_text   var1   var2 
   1        1111      1      aa       None    xx     ps
   2        9999      2      None     tt      jjjj   pppp
   3        1111      2      None     uu      None   oo
   4        9999      1      bb       None    yy     Rt
   5        9999      1      cc       None    zz     tR
Run Code Online (Sandbox Code Playgroud)

目标:数据集应该是什么样子

         connector   q_text   a_text    var1   var1.1   var2   var2.1
   1        1111      aa        uu       xx     None     ps      oo
   2        9999      bb        tt       yy     jjjj     Rt      pppp
   3        9999      cc        tt       zz     jjjj     tR      pppp
Run Code Online (Sandbox Code Playgroud)

逻辑:柱type具有任一值12与具有值的多个行1,但只有一个行(在相同值connector)具有值2

以下是主要的合并规则:

  1. 将 的每一行type=1与其对应的 ( connector)type=2行合并。

  2. 由于多行type=1具有相同的connector值,我不想只合并一行,type=1而是将所有行合并,每行只合并type==2一行。

  3. 由于某些列(例如a_text)遵循左连接逻辑,因此可以在不添加额外列的情况下覆盖值。

  4. 由于var2价值观不能由左加入,因为他们都是非排他性相对于行连接器值被合并,我想有额外的列(var1.1var2.1这些值)( ,)。ppppjjjj

总而言之(并记住我只说具有相同连接器值的行):如果q_textNonei 首先,想要用相应行a_texta_text值(见上表ttuu)(相同连接器值)替换中的值其次,想要将与新列完全相同的对应行的一些其他值(var1var2)附加到新列中。此外,有些行具有connector不会匹配的唯一值。我想保留这些行。

我只想“删除”type=2与其对应type=1行**(s)**合并的行。换句话说:我不想保留 type=2 匹配的行并合并到它们对应的(连接器)type=1行中。我想保留所有其他行。

当我最初想保留所有列(值)时,@victor__von__doom 的解决方案在这里 通过 python 中的多个条件合并不同数量的行得到了回答"type"=2

我使用的代码:合并Persoq_texta_text

df.loc[df['type'] == 2, 'a_date'] = df['q_date']
df.loc[df['type'] == 2, 'a_par'] = df['par']
df.loc[df['type'] == 2, 'a_cons'] = df['cons']
df.loc[df['type'] == 2, 'a_ment'] = df['pret']
df.loc[df['type'] == 2, 'a_le'] = df['q_le']
my_cols = ['Perso', 'q_text','a_text', 'a_le', 'q_le', 'q_date', 'par', 'cons', 'pret', 'q_le', 'a_date','a_par', 'a_cons', 'a_ment', 'a_le']
df[my_cols] = df.sort_values(['connector','type']).groupby('connector')[my_cols].transform(lambda x: x.bfill())
df.dropna(subset=['a_text', 'Perso'],inplace=True)
df.reset_index(drop=True,inplace=True)
Run Code Online (Sandbox Code Playgroud)

数据:这是核心数据集的表示。不幸的是,由于隐私法,我无法分享实际数据。

佩索 ID q_le a_le 漂亮 标准杆 形式 日期 姓名 IO_ID 部分 区域 q_text 文本 国家 缺点 连接器 类型
杰维斯 1-1/4/2001-11-12/1 1999-2009 没有任何 4325 '米,h','d' 2001-11-12 没有任何 345 重新 s—H 没有任何 特尔德 2001-11-12.1.g9 999999999 2
标准 9-3/6/2003-10-14/1 1994-2004 没有任何 23 'sd,h' DG 2003-10-14 没有任何 34555 l? 一世 没有任何 特雷 第三节 关于 2001-04-16.1.a9 333333333 2
在 d 6-1/6/2005-09-03/1 1992-2006年 没有任何 434 '嗯' DG 2005-09-03 没有任何 7313 l? 一世 没有任何 红色 dre 2001-08-07.1.e4 111111111 2
没有任何 3-4/4/2000-07-07/1 1992-2006年 1223 没有任何 '嗯' 文件系统 2000-07-07 阈值 7413 滴滴 节拍 没有任何 三德 2001-07-06.1.j3 111111111 1
没有任何 2-1/6/2001-11-12/1 1999-2009 1444 没有任何 '米,h','d' DG 2001-11-12 时间 7431 l? 一世 泰德 没有任何 第三节 2001-11-12.1.s7 999999999 1
没有任何 1-6/4/2007-11-01/1 1993-2010年 2353 没有任何 没有任何 DG 2007-11-01 Thrj 444 泰德 湖 一世 格格 没有任何 三德 我们 2001-06-11.1.g9 654982984 1

Joe*_*ndz 3

编辑 v2 与附加列

此版本确保附加列中的值不受影响。

c = ['connector','type','q_text','a_text','var1','var2','cumsum','country','others']
d = [[1111, 1, 'aa',  None, 'xx',   'ps',   0, 'US', 'other values'],
     [9999, 2, None,  'tt', 'jjjj', 'pppp', 0, 'UK', 'no values'],
     [1111, 2, None,  'uu', None,   'oo',   1, 'US', 'some values'],
     [9999, 1, 'bb',  None, 'yy',   'Rt',   1, 'UK', 'more values'],
     [9999, 1, 'cc',  None, 'zz',   'tR',   2, 'UK', 'less values']]

import pandas as pd
pd.set_option('display.max_columns', None)
df = pd.DataFrame(d,columns=c)

print (df)

df.loc[df['type'] == 2, 'var1.1'] = df['var1']
df.loc[df['type'] == 2, 'var2.1'] = df['var2']

my_cols = ['q_text','a_text','var1','var2','var1.1','var2.1']

df[my_cols] = df.sort_values(['connector','type']).groupby('connector')[my_cols].transform(lambda x: x.bfill())

df.dropna(subset=['q_text'],inplace=True)
df.reset_index(drop=True,inplace=True)

print (df)
Run Code Online (Sandbox Code Playgroud)

原始数据框:

   connector  type q_text a_text  var1  var2  cumsum country        others
0       1111     1     aa   None    xx    ps       0      US  other values
1       9999     2   None     tt  jjjj  pppp       0      UK     no values
2       1111     2   None     uu  None    oo       1      US   some values
3       9999     1     bb   None    yy    Rt       1      UK   more values
4       9999     1     cc   None    zz    tR       2      UK   less values
Run Code Online (Sandbox Code Playgroud)

更新的数据框

   connector  type q_text a_text var1 var2  cumsum country        others  var1.1 var2.1
0       1111     1     aa     uu   xx   ps       0      US  other values    None     oo 
1       9999     1     bb     tt   yy   Rt       1      UK   more values    jjjj   pppp 
2       9999     1     cc     tt   zz   tR       2      UK   less values    jjjj   pppp 
Run Code Online (Sandbox Code Playgroud)