Если хотите, чтобы все столбцы, такие как строки, сначала обрабатывали все пропущенные значения в col1
, замените NaN
s на пустые строки, преобразуйте все значения в strings
и используйте sum
:
df['col1'] = df['col1'].ffill()
df = df.set_index('col1').fillna('').astype(str).sum(level=0).reset_index()
print (df)
col1 col2 col3 col4
0 A 12 34.0 XX
1 B PR 54.0 PQ
2 C D 32.0 SS
print (df.dtypes)
col1 object
col2 object
col3 object
col4 object
dtype: object
При необходимости обрабатывает только числовые столбцы с помощью агрегатного метода, например, mean
используйте лямбда-функцию с if-else
:
df['col1'] = df['col1'].ffill()
c = df.select_dtypes(object).columns
df[c] = df[c].fillna('')
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else ''.join(x)
df = df.groupby('col1').agg(f).reset_index()
print (df)
col1 col2 col3 col4
0 A 12 34.0 XX
1 B PR 54.0 PQ
2 C D 32.0 SS
print (df.dtypes)
col1 object
col2 object
col3 float64
col4 object
dtype: object
РЕДАКТИРОВАТЬ: используется новый вспомогательный столбец:
df['new'] = df['col1'].notna().cumsum()
df['col1'] = df['col1'].ffill()
c = df.select_dtypes(object).columns
df[c] = df[c].fillna('')
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else ''.join(x)
df = df.groupby(['col1', 'new']).agg(f).reset_index(level=1, drop=True).reset_index()