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

时间:2017-06-02 01:54:49

标签: python pandas dataframe rows collapse

我有以下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来实现这一点。

2 个答案:

答案 0 :(得分:5)

选项0
超级简单

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

我们可以为每列处理多个值吗?
当然可以!

np.where

选项1
使用v = df.values i, j = np.where(np.isnan(v)) s = pd.Series(v[i, j], df.columns[j]) c = s.groupby(level=0).cumcount() s.index = [c, s.index] s.unstack(fill_value='-') # <-- don't fill to get NaN col1 col2 col3 col4 col5 col6 0 ABC1 15.0 24RA Large 345 US 的广义解决方案,如外科医生

df.loc[2, 'col3'] = 'Test'

v = df.values
i, j = np.where(np.isnan(v))

s = pd.Series(v[i, j], df.columns[j])

c = s.groupby(level=0).cumcount()
s.index = [c, s.index]
s.unstack(fill_value='-')  # <-- don't fill to get NaN

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

选项2
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 - - - 摆脱它们

或者我们可以

{{1}}

答案 1 :(得分:1)

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

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

您也可以使用回填和前向填充的组合来填补空白,如果只想将其应用于您的某些列,这可能很有用:

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