Объединить значения столбца фрейма данных Pandas в новый столбец
Я работаю с Pandas, и у меня есть кадр данных, где мы можем иметь одно из трех значений:
ID_1 ID_2 ID_3
abc NaN NaN
NaN def NaN
NaN NaN ghi
NaN NaN jkl
NaN mno NaN
pqr NaN NaN
И моя цель - объединить эти три столбца в новые столбцы в моем кадре данных:
ID_1 ID_2 ID_3 Combined_ID
abc NaN NaN abc
NaN def NaN def
NaN NaN ghi ghi
NaN NaN jkl jkl
NaN mno NaN mno
pqr NaN NaN pqr
В идеале он просто найдет то, что не имеет значения null в столбцах с 1 по 3, но я мог бы также конкатенировать, так как мы должны иметь только одну из трех, заполненных для каждой строки. Спасибо.
df_note = pd.read_csv("NoteIds.csv")
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3
Ответы
Ответ 1
Вы можете использовать свойство, которое суммирует, будет конкатенировать строковые значения, чтобы вы могли вызвать fillna
и передать пустую строку и вызов sum
и передать param axis=1
для суммирования по строке:
In [26]:
df['Combined_ID'] = df.fillna('').sum(axis=1)
df
Out[26]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
Если вас интересуют только эти 3 столбца, вы можете просто выбрать их:
In [39]:
df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1)
df
Out[39]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
Ответ 2
Предположим, что в строке может быть больше одного значения, отличного от NaN. Тем не менее это должно сработать.
In [43]: df['Combined_ID'] = df.apply(
lambda x : ''.join([e for e in x if isinstance(e, basestring)]),
axis=1)
Для каждой строки извлекайте строки и присоединяйте их.
In [44]: df
Out[44]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
Мне понравился ответ @EdChum и выглядит более читаемым.
Интересно, что метод fillna('').sum(axis=1)
является дорогостоящим для этих меньших данных.
In [45]: %timeit df.fillna('').sum(axis=1)
1000 loops, best of 3: 808 µs per loop
In [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1)
1000 loops, best of 3: 285 µs per loop
Только для ['ID_1','ID_2','ID_3']
столбцов
df[['ID_1','ID_2','ID_3']].apply(lambda_function)