#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