Fundir vários valores de uma coluna depois por grupo para uma coluna em pandas python

H_A:

Eu estou olhando para fazer tarefa semelhante como neste tópico: Mesclar vários valores de coluna em uma coluna no pandas python

Mas a diferença é que eu gostaria de criar uma nova coluna que mescla todos os valores não nulos em uma coluna após agrupamento por outra coluna (s). Aqui está um exemplo de brinquedo:

df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,'1', np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})

 df
Out[74]: 
     ID1 ID2 Status
 0    1   a    NaN
 1    1   a      1
 2    2   b    NaN
 3    2   b      1
 4    3   c      2
 5    3   c    NaN
 6    3   c      1

Eu, então, querer groupby ID1e ID2:

gr = df.groupby(['ID1','ID2'])

Então, eu gostaria que o meu resultado parecido com este:

Out:
   NewCol
0   1
1   1
2   2,1

Por isso, é um novo DataFrameque contém os non-nullvalores de Statuscoluna agrupadas por ID1e ID2.

Desde já, obrigado.

Jezreel:

Use GroupBy.aggcom a função lambda é a solução mais geral:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a      1
1    2   b      1
2    3   c    2,1

Outra idéia é remover duplicado na primeira etapa, mas se algum grupo com valores somente misisng ele é removido da saída, então é necessário processamento seguinte como merge:

#first group with only NaNs
df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,np.nan, np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})


#first group is dropped
df11 = (df.dropna(subset=['Status'])
          .groupby(['ID1','ID2'])['Status']
          .agg(','.join)
          .reset_index())
print (df11)
   ID1 ID2 Status
0    2   b      1
1    3   c    2,1

#added missing pairs and `NaN`s converted to empty strings:
df2 = df.drop_duplicates(['ID1','ID2'])[['ID1','ID2']].merge(df11, how='left').fillna('')
print (df2)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1

Primeira solução:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=351701&siteId=1
Recomendado
Clasificación