【发布时间】:2021-06-11 11:43:42
【问题描述】:
问题:通过多个条件合并不同数量的行
这是数据集外观的风格示例
"index" "connector" "type" "q_text" "a_text" "varx" ...
1 1111 1 aa NA xx
2 9999 2 NA tt NA
3 1111 2 NA uu NA
4 9999 1 bb NA yy
5 9999 1 cc NA zz
目标:数据集应该的样子
"index" "connector" "type" "type.1" "q_text" "q_text.1" "a_text" "a_text.1 " "varx" "varx.1" ...
1 1111 1 2 aa NA NA uu xx NA
2 9999 1 2 bb NA NA tt yy NA
3 9999 1 2 cc NA NA tt zz NA
逻辑:列“type”的值为 1 或 2,而多行的值为 1,但只有一行(“connector”中的值相同)值为 2
如果 “连接器”中的相同值 然后 合并 “type”行=2,“type”行=1 但是 (因为“type”=1的多行在“connector”中有相同的值) 重复 type=2 的对应行 和 合并 在“connector”中也具有相同值且属于“type”=1 的所有其他行
我的结果:并非所有结果都被合并,因为“type”=1 的多行与“type”=2 的 UNIQUE 行相关联
大多数类似的问题都是用 SQL 来回答的,我在这里不能用。
df2 = df.copy()
df.index.astype(str)
df2.index.astype(str)
pd.merge(df,df2, how='left', on='connector',right_index=True, left_index=True)
df3 = pd.merge(df.set_index('connector'),df2.set_index('connector'), right_index=True, left_index=True).reset_index()
dfNew = df.merge(df2, how='left', left_on=['connector'], right_on = ['connector'])
我可以通过 goupby() 实现我的目标吗?
@victor__von__doom 的解决方案
if __name__ == '__main__':
df = df.groupby('connector', sort=True).apply(lambda c: list(zip(*c.values[:,2:].tolist()))).reset_index(name='merged')
df[['here', 'are', 'all', 'columns', 'except', 'for', 'the', 'connector', 'column']] = pd.DataFrame(df.merged.tolist())
df = df.drop(['merged'], axis=1)
【问题讨论】:
标签: python-3.x dataframe validation merge pandas-groupby