Python pandas – установить значение столбца столбца на основе индекса и/или идентификатора конкатенированных кадров данных

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

i.e. 
df1
  Name | Type | ID
0 Joe     A     1
1 Fred    B     2
2 Mike   Both   3
3 Frank  Both   4

df2
  Name | Type | ID
0 Bill   Both    1
1 Jill   Both    2
2 Mill   B       3
3 Hill   A       4

ConcatDf:
  Name | Type | ID
0 Joe     A     1
1 Fred    B     2
2 Mike   Both   3
3 Frank  Both   4
0 Bill   Both   1
1 Jill   Both   2
2 Mill   B      3
3 Hill   A      4

Предположим, что после они объединены, я хотел бы установить Type для всех записей от df1 до C и всех записей от df2 до B. Это возможно?

Индексы фреймов данных могут быть самых разных размеров.

Заранее спасибо.

Почему бы просто не сделать это до, которое вы объединяете? Это похоже на проблему XY

user3483203 29.05.2019 00:11

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

machump 29.05.2019 00:16
0
2
838
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
df3 = pd.concat([df1,df2], keys = (1,2))

df3.loc[(1), 'Type'] == 'C'

Когда вы concat, вы можете назначить клавиши df. Это создаст мультииндекс с ключами, разделяющими объединенные df. Затем, когда вы используете .loc с ключами, вы можете использовать ( вокруг ключа, чтобы вызвать группу. В приведенном выше коде мы изменили бы все типы df1 (с ключом 1) на C.

Используйте merge с indicator=True, чтобы найти строки, принадлежащие df1 или df2. Затем используйте np.where, чтобы назначить A или B.

t = concatdf.merge(df1, how='left', on=concatdf.columns.tolist(), indicator=True)
concatdf['Type'] = np.where(t._merge.eq('left_only'), 'B', 'C')


Out[2185]:
    Name Type  ID
0    Joe    C   1
1   Fred    C   2
2   Mike    C   3
3  Frank    C   4
0   Bill    B   1
1   Jill    B   2
2   Mill    B   3
3   Hill    B   4

Другие вопросы по теме