pandas 将多个列与管道连接在一起,同时跳过空值

pandas concatenate multiple columns together with pipe while skip the empty values

嗨,我想在 pandas python 中使用管道作为连接器将多个列连接在一起,如果列是空白值,则跳过此列。

我试过下面的代码,当它为空时它不会跳过值,它仍然会有一个'|'与其他字段连接,我想要的是完全通过空字段..

例如:目前它给了我 'N|911|WALLACE|AVE||||MT|031|000600'

虽然我想要 'N|911|WALLACE|AVE|MT|031|000600'

df['key'] = df[['fl_predir','fl_prim_range','fl_prim_name','fl_addr_suffix','fl_postdir','fl_unit_desig','fl_sec_range','fl_st','fl_fips_county','blk']].agg('|'.join, axis=1)

谁能帮我解决这个问题?

cols = ['fl_predir','fl_prim_range','fl_prim_name','fl_addr_suffix','fl_postdir','fl_unit_desig','fl_sec_range','fl_st','fl_fips_county','blk']
df['key'] = df[cols].apply(lambda row: '|'.join(x for x in row if x), axis=1, raw=True)

您可以使用 melt 来扁平化数据框,删除空值,然后按索引分组,最后连接值:

cols = ['fl_predir', 'fl_prim_range', 'fl_prim_name', 'fl_addr_suffix' , 
        'fl_postdir', 'fl_unit_desig', 'fl_sec_range', 'fl_st', 
        'fl_fips_county', 'blk']

df['key'] = (df[cols].melt(ignore_index=False)['value'].dropna()
                     .astype(str).groupby(level=0).agg('|'.join))

输出:

>>> df['key']
0    N|911|WALLACE|AVE|MT|31|600
Name: key, dtype: object

备选 (Pandas < 1.1.0)

df['keys'] = (df[cols].unstack().dropna().astype(str)
                      .groupby(level=1).agg('|'.join))