У меня есть набор данных, отформатированный следующим образом:
В частности, набор данных в настоящее время содержит около 2000 столбцов.
Я хочу уменьшить количество столбцов, удалив как можно больше пустых строк, следующим образом:
Меня не интересуют названия столбцов.
Предположим, что пустые ячейки NaN
, если нет, то сначала replace('', np.nan)
.
Вы можете складывать и поворачивать:
cols = df.columns[1:]
# ['0_x', '1_x', 'N_x']
(df.set_index('sha')
.stack()
.reset_index()
.assign(cols=lambda d: d.groupby('sha')
.cumcount()
.map(dict(enumerate(cols)))
)
.pivot(index='sha', columns='cols', values=0)
.reset_index()
)
Другой вариант, с применить:
cols = list(df.columns[1:])
# ['0_x', '1_x', 'N_x']
(df.set_index('sha')
.apply(lambda s: s.dropna().reset_index(drop=True), axis=1)
.pipe(lambda d: d.set_axis(cols[:len(d.columns)], axis=1))
.reset_index()
)
Выход:
cols sha 0_x 1_x
0 Sha1 rm rm
1 Sha2 rw rw
2 Sha3 rw NaN
3 Sha4 tr NaN
Другое возможное решение:
(df.set_index('sha')
.replace(r'$', '_', regex=True)
.replace(np.nan, '')
.sum(numeric_only=False, axis=1)
.str.split('_+', regex=True, expand=True)
.replace('', np.nan)
.dropna(how='all', axis=1)
.pipe(lambda d: d.set_axis(d.columns.astype('str') + '_x', axis=1))
.reset_index())
Выход:
sha 0_x 1_x
0 Sha1 rm rm
1 Sha2 rw rw
2 Sha3 rw NaN
3 Sha4 tr NaN