Mova cada segunda linha para a linha acima no quadro de dados do pandas

9

Eu tenho o quadro de dados nesta forma:

    A     B     C    D     E 
  213-1  XL   NaN    NaN    NaN
  21   22.0   12   232.0  101.32
  23-0    L   NaN    NaN    NaN
  12     23   12   232.2    NaN
  31-0   LS   NaN    NaN    NaN
  70     70   23     NaN   21.22

Gostaria de mover cada segunda linha desse quadro de dados para a linha acima, para que restem apenas linhas combinadas, como visto no resultado esperado:

     ID   Name     A     B    C     D     E
   213-1    XL    21   22.0  12  232.0  101.32
   23-0      L    12     23  12  232.2     NaN
   31-0     LS    70     70  23    NaN   21.22

É possível fazer com os pandas?

Alex T
fonte

Respostas:

11

Eu usaria concat:

new_df = pd.concat((df.iloc[::2, :2].reset_index(drop=True), 
                    df.iloc[1::2].reset_index(drop=True)),
                   axis=1)

# rename
new_df.columns = ['ID', 'Name'] + new_df.columns[2:].to_list()

Resultado:

      ID Name   A     B     C      D       E
0  213-1   XL  21  22.0  12.0  232.0  101.32
1   23-0    L  12    23  12.0  232.2     NaN
2   31-0   LS  70    70  23.0    NaN   21.22
Quang Hoang
fonte
6

concatem df.iloc[::2]e df.iloc[1::2]:

df1= (df.iloc[::2].dropna(axis=1).reset_index(drop=True))
df2 = (df.iloc[1::2].reset_index(drop=True))

print (pd.concat([df1,df2],ignore_index=True,axis=1))

#
       0   1   2     3     4      5       6
0  213-1  XL  21  22.0  12.0  232.0  101.32
1   23-0   L  12    23  12.0  232.2     NaN
2   31-0  LS  70    70  23.0    NaN   21.22
Henry Yik
fonte
4
master_df = df[~df['C'].isna()].reset_index(drop=True)
master_df[['ID','Name']] = pd.DataFrame(df[df['C'].isna()][['A','B']].reset_index(drop=True), index=master_df.index)

Resultado

##print(master_df[['ID','Name','A', 'B', 'C', 'D', 'E']])


     ID Name   A     B     C      D       E
0  213-1   XL  21  22.0  12.0  232.0  101.32
1   23-0    L  12    23  12.0  232.2     NaN
2   31-0   LS  70    70  23.0    NaN   21.22
iamklaus
fonte