Конкаты панд с использованием одного столбца мультииндекса - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь объединить новые данные, которые имеют одно значение на каждое значение одного столбца мультииндекса.Базовый пример:

data = io.StringIO('''Fruit,Color,Count,Price
Apple,Red,3,$1.29
Apple,Green,9,$0.99
Pear,Red,25,$2.59
Pear,Green,26,$2.79
Lime,Green,99,$0.39
''')
df_unindexed = pandas.read_csv(data)
df = df_unindexed.set_index(['Fruit', 'Color'])
df

join = io.StringIO('''Fruit,Count2
Apple,3
Pear,25
Lime,99
''')
join = pandas.read_csv(join)
join = join.set_index(['Fruit'])
join

Я хотел бы объединить новые данные, используя только столбец индекса фруктов, давая:

             Count  Price  Count2
Fruit Color                      
Apple Red        3  $1.29       3
      Green      9  $0.99       3
Pear  Red       25  $2.59      25
      Green     26  $2.79      25
Lime  Green     99  $0.39      99

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

on='Fruit'

Вы можете указать, какой уровень индекса или столбец использовать в качестве критерия join с аргументом on.

df.join(join, on='Fruit')

             Count  Price  Count2
Fruit Color                      
Apple Red        3  $1.29       3
      Green      9  $0.99       3
Pear  Red       25  $2.59      25
      Green     26  $2.79      25
Lime  Green     99  $0.39      99
0 голосов
/ 06 декабря 2018

Использование reset_index + set_index + assign

df.reset_index(level=1).assign(count2=join.Count2).set_index('Color',append=True)
Out[1068]: 
             Count  Price  count2
Fruit Color                      
Apple Red        3  $1.29       3
      Green      9  $0.99       3
Pear  Red       25  $2.59      25
      Green     26  $2.79      25
Lime  Green     99  $0.39      99
0 голосов
/ 06 декабря 2018

Используйте get_level_values с map, в последней версии .get должно быть опущено:

df['count2'] = df.index.get_level_values('Fruit').map(join['Count2'].get)
print (df)
             Count  Price  count2
Fruit Color                      
Apple Red        3  $1.29       3
      Green      9  $0.99       3
Pear  Red       25  $2.59      25
      Green     26  $2.79      25
Lime  Green     99  $0.39      99

Если возможно, несколько столбцов в join используйте reset_index, join и set_index:

df = df.reset_index(level=1).join(join).set_index('Color', append=True)
...