Pandas - объединить два DataFrames с одинаковыми именами столбцов и объединить информацию о двух DataFrames в одной ячейке - PullRequest
0 голосов
/ 01 марта 2020

У меня есть два кадра данных с одинаковыми именами столбцов и одинаковыми идентификаторами в первом столбце. В первом кадре данных у меня есть int информация, а во втором - стр.

Вот пример того, как они выглядят:

ID    Cat1    Cat2    Cat3  
1     1        1       0 
2     0        2       1 
3     0        0       5


ID    Cat1    Cat2    Cat3 
1     text    text    text 
2     text    text    text
3     text    text    text

Я хочу объединить их в один DataFrame и объединить информация о двух кадрах данных в одни и те же ячейки. Таким образом, результат будет выглядеть следующим образом:

ID    Cat1      Cat2         Cat3  
1    1, text   1, text     0, text 
2    0, text   2, text     1, text  
3    0, text   0, text     5, text

Я пытался использовать pandas .combine, но он не работал должным образом.

Возможно ли решить эту задачу?

Ответы [ 3 ]

2 голосов
/ 01 марта 2020

фильтр из столбцов для объединения; добавить ',' и преобразовать соответствующие столбцы из int в строку. наконец, конкат назад к df.ID на оси столбцов

Merged_Dfs = (df.filter(like='Cat').astype(str)
             .add(', ')
             .add(df1.filter(like='Cat').astype(str)))

pd.concat([df.ID,
           Merged_Dfs
           ],axis=1)

    ID  Cat1    Cat2    Cat3
0   1   1, text 1, text 0, text
1   2   0, text 2, text 1, text
2   3   0, text 0, text 5, text

В качестве альтернативы, вы можете использовать pandas insert, чтобы подключить df.ID к объединенным Dfs в качестве первого столбца

Merged_Dfs.insert(0,'ID',df.ID)

print(Merged_Dfs)
1 голос
/ 01 марта 2020

Вы можете использовать pandas.DataFrame.conbine для объединения двух фреймов данных. Однако вам нужно передать правильную функцию атрибуту func.


merge = lambda x,y: [x,y]
df1.combine(df2, func = lambda s1,s2: s1.combine(s2, func = merge))

Обратите внимание, что переменная этой функции - pandas.Series. Таким образом, pandas.Series.combine вызывается для получения правильного результата.

1 голос
/ 01 марта 2020

Вы можете использовать combine, чтобы объединить два фрейма данных, используя pd.Series.str.cat, чтобы объединить элементы каждого фрейма данных:

df1.set_index('ID').astype(str).combine(df2.set_index('ID'), lambda x,y: x.str.cat(y, sep=', '))

Это требует установки индекса как ID и использования чисел в качестве строк. .

Вывод:

       Cat1     Cat2     Cat3
ID                           
1   1, text  1, text  0, text
2   0, text  2, text  1, text
3   0, text  0, text  5, text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...