Объединить значения нескольких столбцов в один столбец в python pandas
У меня есть кадр данных pandas, как это:
Column1 Column2 Column3 Column4 Column5
0 a 1 2 3 4
1 a 3 4 5
2 b 6 7 8
3 c 7 7
Теперь я хочу получить новый dataframe, содержащий Column1 и новый столбец A. Этот столбец A должен содержать все значения из столбцов 2 - (to) n (где n - количество столбцов из столбца 2 в конец строки), например:
Column1 ColumnA
0 a 1,2,3,4
1 a 3,4,5
2 b 6,7,8
3 c 7,7
Как я мог бы наилучшим образом подойти к этой проблеме? Любые советы будут полезны. Спасибо заранее!
Ответы
Ответ 1
Вы можете вызвать apply
передать axis=1
в apply
построчно, затем преобразовать dtype в str
и join
:
In [153]:
df['ColumnA'] = df[df.columns[1:]].apply(
lambda x: ','.join(x.dropna().astype(str)),
axis=1
)
df
Out[153]:
Column1 Column2 Column3 Column4 Column5 ColumnA
0 a 1 2 3 4 1,2,3,4
1 a 3 4 5 NaN 3,4,5
2 b 6 7 8 NaN 6,7,8
3 c 7 7 NaN NaN 7,7
Здесь я вызываю dropna
, чтобы избавиться от NaN
, однако нам нужно снова привести к int
, чтобы мы не заканчивали с плавающей точкой как str.
Ответ 2
Я предлагаю использовать .assign
df2 = df.assign(ColumnA = df.Column2.astype(str) + ', ' + \
df.Column3.astype(str) + ', ' df.Column4.astype(str) + ', ' \
df.Column4.astype(str) + ', ' df.Column5.astype(str))
это просто, может быть долго, но у меня это сработало
Ответ 3
Если у вас много столбцов, скажем - 1000 столбцов в кадре данных, и вы хотите объединить несколько столбцов на основе particular column name
например - Column2
и произвольный номер. столбцов после этого столбца (например, здесь 3 столбца после 'Column2
включая Column2
как Column2
в Column2
OP).
Мы можем получить положение столбца, используя .get_loc()
- как здесь ответили
source_col_loc = df.columns.get_loc('Column2') # column position starts from 0
df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply(
lambda x: ",".join(x.astype(str)), axis=1)
df
Column1 Column2 Column3 Column4 Column5 ColumnA
0 a 1 2 3 4 1,2,3,4
1 a 3 4 5 NaN 3,4,5
2 b 6 7 8 NaN 6,7,8
3 c 7 7 NaN NaN 7,7
Чтобы удалить NaN
, используйте .dropna()
или .fillna()
Надеюсь, поможет!
Ответ 4
Основываясь на ответе Amin, вы можете использовать df.assign со списком столбцов любых типов, которые могут не быть строками:
target_cols = ['Column1', 'Column2']
sep = ' '
df = df.assign(JoinKey = lambda srs: sep.join(str(x) for x in srs[target_cols]))