如果所有行的列中只有一个值,则折叠Pandas Dataframe 中的行

0md85ypi  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(139)

我有以下DF

col1  |  col2   | col3   | col4   | col5  | col6
    0    -     |   15.0  |  -     |  -     |   -   |  -
    1    -     |   -     |  -     |  -     |   -   |  US
    2    -     |   -     |  -     |  Large |   -   |  -
    3    ABC1  |   -     |  -     |  -     |   -   |  -
    4    -     |   -     |  24RA  |  -     |   -   |  -
    5    -     |   -     |  -     |  -     |   345 |  -

我想按如下方式将行折叠为一行

output DF:
         col1  |  col2    | col3   | col4   | col5  | col6
    0    ABC1  |   15.0   |  24RA  |  Large |   345 |  US

我不想迭代列,但想使用Pandas来实现这一点。

odopli94

odopli941#

您可以使用max,但是您需要转换字符串值列中的空值(不幸的是,这有点难看)

>>> df = pd.DataFrame({'col1':[np.nan, "ABC1"], 'col2':[15.0, np.nan]})

>>> df.apply(lambda c: c.fillna('') if c.dtype is np.dtype('O') else c).max()
col1    ABC1
col2      15
dtype: object

您也可以使用fillback和forwardfill的组合来填充空隙,如果只想将此方法应用于某些列,则此方法可能会很有用:

>>> df.apply(lambda c: c.fillna(method='bfill').fillna(method='ffill'))
62lalag4

62lalag42#

选项0

  • 超级简单 *
pd.concat([pd.Series(df[c].dropna().values, name=c) for c in df], axis=1)

   col1  col2  col3   col4   col5 col6
0  ABC1  15.0  24RA  Large  345.0   US
  • 我们可以在每列中处理多个值吗?*
  • 当然可以 *
df.loc[2, 'col3'] = 'Test'

   col1  col2  col3   col4   col5 col6
0  ABC1  15.0  Test  Large  345.0   US
1   NaN   NaN  24RA    NaN    NaN  NaN

选项1

  • 像外科医生一样使用np.where的广义解 *

第一次

选项2

  • mask生成空值,然后stack删除空值 *

或者我们可以

# This should work even if `'-'` are NaN
# but you can skip the `.mask(df == '-')`
s = df.mask(df == '-').stack().reset_index(0, drop=True)
c = s.groupby(level=0).cumcount()
s.index = [c, s.index]
s.unstack(fill_value='-')

   col1  col2  col3   col4 col5 col6
0  ABC1  15.0  Test  Large  345   US
1     -     -  24RA      -    -    -

相关问题