在不包括 NaN 的数据框列上连接值

Concat values on dataframe columns excluding NaN's

我有一个包含 n store 列的数据框,这里我只显示前 2 个:

     ref_id  store_0     store_1
0       100        c           b
1       300        d         NaN

我想要一种方法,仅将 store 列中的非 NaN 值连接到一个新列中,在每个值之间添加一个逗号,最后删除这些列。期望的输出是:

     ref_id  stores  
0       100     c,b
1       300       d

现在我已经尝试 df['stores'] = df['store_0'] + ',' + df['store_1'] 这个结果:

     ref_id  store_0  store_1  stores    
0       100        c        b     c,b
1       300        d      NaN     NaN

试试

df['store'] = df.filter(like = 'store').apply(lambda x : ','.join(x[x==x]),1)
df
Out[60]: 
   ref_id store_0 store_1 store
0     100       c       b   c,b
1     300       d     NaN     d

您可以使用:

cols = df.filter(like='store_').columns

df2 = (df
 .drop(columns=cols)
 .assign(stores=df[cols].agg(lambda s: s.dropna()
                                        .str.cat(sep=','), 
                             axis=1))
 )

或者,对于就地修改:

cols = df.filter(like='store_').columns

df['stores'] = df[cols].agg(lambda s: s.dropna().str.cat(sep=','), axis=1)
df.drop(columns=cols, inplace=True)

输出:

   ref_id stores
0     100    c,b
1     300      d

你可以试试

df_ = df.filter(like='store')
df = (df.assign(store=df_.apply(lambda row : row.str.cat(sep=','), axis=1))
      .drop(df_.columns, axis=1))
print(df)

   ref_id store
0     100   c,b
1     300     d