pandas 如何在Python中压缩具有空行的数据集?

xt0899hw  于 2022-11-27  发布在  Python
关注(0)|答案(2)|浏览(135)

我有一个数据集,格式如下:
| 沙|0_x| 1个_x| N_x(_X)|
| - -|- -|- -|- -|
| 沙一段|额定值||额定值|
| 沙二段|无线电||无线电|
| 沙三段|||无线电|
| 沙四段||树||
特别是,数据集目前包含约2000个数据行。
我想减少列数,删除尽可能多的空行,如下所示:
| 沙|0_x| 1个_x|
| - -|- -|- -|
| 沙一段|额定值|额定值|
| 沙二段|无线电|无线电|
| 沙三段|无线电||
| 沙四段|树||
我不关心列的名称。

llmtgqce

llmtgqce1#

假设空单元格是NaN,如果不是,则首先是replace('', np.nan)
您可以stackpivot

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

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
9o685dep

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

相关问题