Добавить значения строк всех столбцов, когда конкретное значение столбца равно нулю, пока не получит ненулевые значения? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть такой фрейм данных:

df
col1      col2      col3      col4
 A         12        34        XX
 B         20        25        PP
 B         nan       nan       nan
 nan       P         54        nan
 nan       R         nan       nan
 nan       nan       nan       PQ
  C         D         32       SS
  R         S         32       RS

Если значение col1 равно null, я хочу добавить все значения других столбцов, пока не найдет элемент notnull в col1

Фрейм данных, который я ищу, должен выглядеть следующим образом:

col1     col2     col3     col4
 A         12       34       XX
 B         20       25       PP
 B         PR       54       PQ
 C          D       32       SS
 R          S       32       RS        

Как наиболее эффективно использовать python / pandas

1 Ответ

5 голосов
/ 26 марта 2019

Если хотите, чтобы все столбцы, такие как строки, сначала обрабатывали все пропущенные значения в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...