Pandas Dataframe добавляет столбцы на основе существующих данных - PullRequest
1 голос
/ 25 февраля 2020

У меня есть фрейм данных с сотнями столбцов и тысячами строк, но базовая структура c равна

Index     0       1       2
0         AAA     NaN     AAA
1         NaN     BBB     NaN
2         NaN     NaN     CCC
3         DDD     DDD     DDD

Я хотел бы добавить два новых столбца, один из которых будет равен id, который будет равен первое значение в каждой строке, второе будет подсчетом значений в каждой строке. Это будет выглядеть так. Для ясности все строки всегда будут иметь одинаковое значение.

Index   id    count     0       1       2
0        AAA     2      AAA     NaN     AAA
1        BBB     1      NaN     BBB     NaN
2        CCC     1      NaN     NaN     CCC
3        DDD     3      DDD     DDD     DDD

Любая помощь в поиске способа сделать это будет принята с благодарностью. Спасибо

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Это должно работать.

df['id'] = df.bfill(axis=1).iloc[:, 0].fillna('All NANs')
df['count'] = df.drop(columns=["id"]).notnull().sum(axis=1)

Для поддержания порядка столбцов:

df = df[list(df.columns[-2:]) + list(df.columns[:-2])]
1 голос
/ 25 февраля 2020

Создание фрейма данных

test_df = pd.DataFrame([['AAA',np.nan,'AAA'], [np.nan,'BBB',np.nan], [np.nan,np.nan, 'CCC'], ['DDD','DDD','DDD']])

Считать не-NaN элементы в каждой строке как count

test_df['count'] = test_df.notna().sum(axis=1)

Опция 1: Выберите первый элемент в строке как id (независимо от значения NaN)

test_df['id'] = test_df[0]

Option-2: Выберите первый не-NaN элемент как id для каждой строки

test_df['id'] = test_df.apply(lambda x: x[x.first_valid_index()], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...