Объединить все столбцы в один с пустыми ячейками

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

Я хочу объединить большое количество столбцов, содержащих похожие данные, в один столбец. Строки в dataframe содержат много пустых ячеек, поскольку каждая строка имеет свой собственный столбец для этих похожих данных. Например:

 Name    Weight  Addressw    Addressx    Addressy    Addressz
A       10                  11 g place  
B       15      6, corner
C       24      15, lane                garbage
D       33                                          51, street
 

В строке C, поскольку два столбца содержат информацию, я хотел бы перенести первый, то есть «15, полоса», в новый столбец. Таким образом, результирующий фрейм данных будет выглядеть так:

 Name    Weight  Address
A       10      11 g place
B       15      6, corner
C       24      15, lane
D       33      51, street
 

Ответ №1:

IIUC, вы могли бы сделать:

 df['Address'] = df.lookup(np.arange(len(df)), (~df.iloc[:, 2:].isna()).idxmax(1))
result = df[['Name', 'Weight', 'Address']]

print(result)
 

Вывод

   Name  Weight     Address
0    A      10  11 g place
1    B      15   6, corner
2    C      24    15, lane
3    D      33  51, street
 

Подход будет принимать первый действительный адрес из каждой строки.

Ответ №2:

Если возможно, используйте один или несколько адресов в строках join в лямбда-функции с удалением возможных пропущенных значений:

 f = lambda x: ' '.join(y for y in x if pd.notna(y))
df = df.set_index(['Name', 'Weight']).agg(f, axis=1).reset_index(name='Address')
print (df)
  Name  Weight           Address
0    A      10        11 g place
1    B      15         6, corner
2    C      24  15, lane garbage
3    D      33        51, street
 

Если существует, всегда используйте только один ffill для прямого заполнения пропущенных значений и выбора последнего столбца:

 df = df.set_index(['Name', 'Weight']).ffill(axis=1).iloc[:, -1].reset_index(name='Address')
print (df)
  Name  Weight           Address
0    A      10        11 g place
1    B      15         6, corner
2    C      24  15, lane garbage
3    D      33        51, street