在python中按多个条件合并不同数量的行和列
问题描述
已更新问题:为什么不合并a_date
、a_par
、a_cons
、a_ment
和a_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
具有值1
或2
,其中多行具有值1
,但只有一行(在connector
中具有相同值)具有值2
以下是主要的合并规则:
将
type=1
的每一行与其对应的(connector
)type=2
行合并。由于
type=1
的多行具有相同的connector
值,因此我不想只合并type=1
的一行,而是合并所有行,每行都有唯一的type==2
行。由于某些列(例如
a_text
)遵循左联接逻辑,因此可以在不添加额外列的情况下重写值。由于
var2
值不能通过左联接合并,因为它们相对于行连接器值是非排他性的,因此我希望为这些值(pppp
,jjjj
)增加额外的列(var1.1
,var2.1
)。
q_text
是None
i,首先,希望将a_text
中的值替换为相应行(相同连接器值)的a_text
值(请参见上表tt
和uu
),其次,希望追加一些其他值(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
列(值)时得到回答。
我使用的代码:合并后的Perso
、q_text
和a_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:这是核心数据集的表示形式。很遗憾,由于隐私法的原因,我无法共享实际数据。
相关文章