我有一个数据集,格式如下:| 沙|0_x| 1个_x| N_x(_X)|| - -|- -|- -|- -|| 沙一段|额定值||额定值|| 沙二段|无线电||无线电|| 沙三段|||无线电|| 沙四段||树||特别是,数据集目前包含约2000个数据行。我想减少列数,删除尽可能多的空行,如下所示:| 沙|0_x| 1个_x|| - -|- -|- -|| 沙一段|额定值|额定值|| 沙二段|无线电|无线电|| 沙三段|无线电||| 沙四段|树||我不关心列的名称。
llmtgqce1#
假设空单元格是NaN,如果不是,则首先是replace('', np.nan)。您可以stack和pivot:
NaN
replace('', np.nan)
stack
pivot
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() )
其他选项,使用apply:
apply
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
9o685dep2#
另一种可能的解决方案:
(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
2条答案
按热度按时间llmtgqce1#
假设空单元格是
NaN
,如果不是,则首先是replace('', np.nan)
。您可以
stack
和pivot
:其他选项,使用
apply
:输出量:
9o685dep2#
另一种可能的解决方案:
输出量: