Przenieś co drugi rząd do rzędu powyżej w ramce danych pandy

9

Mam ramkę danych w tym kształcie:

    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

Chciałbym przenieść co drugi wiersz tej ramki danych do wiersza powyżej, aby pozostały tylko połączone wiersze, jak widać w oczekiwanym wyniku:

     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

Czy można zrobić z Pandami?

Alex T.
źródło

Odpowiedzi:

11

Użyłbym 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()

Wynik:

      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
źródło
6

concatw dniu df.iloc[::2]i 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
źródło
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)

Wynik

##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
źródło