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

2022-02-28 00:00:00 python-3.x pandas merge join left-join

问题描述

已更新问题:为什么不合并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

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

         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

逻辑:列type具有值12,其中多行具有值1,但只有一行(在connector中具有相同值)具有值2

以下是主要的合并规则:

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

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

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

  4. 由于var2值不能通过左联接合并,因为它们相对于行连接器值是非排他性的,因此我希望为这些值(ppppjjjj)增加额外的列(var1.1var2.1)。

总而言之(请记住,我只提到具有相同连接器值的行):如果q_textNonei,首先,希望将a_text中的值替换为相应行(相同连接器值)的a_text值(请参见上表ttuu),其次,希望追加一些其他值(var1和<[2-19]] 此外,还有一些具有唯一connector值的行不会匹配。不过,我想保留这些行。

我只想删除与其对应的type=1行**合并的type=2行**(&q;)。换句话说:我不想保留类型=2的行,这些行有一个匹配项并合并到它们相应的(连接器)type=1行中。不过,我希望保留所有其他行。

@victor__von__doom在此处提供解决方案 merging varying number of rows by multiple conditions in 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)

data:这是核心数据集的表示形式。很遗憾,由于隐私法的原因,我无法共享实际数据。

相关文章