我正在尝试加入一个新数据,该数据在多索引的一列的每个值中都有一个值。一个基本的例子是:
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
答案 0 :(得分:3)
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
答案 1 :(得分:2)
将get_level_values
与map
一起使用,在最新版本number
中应省略:
.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
中的多列使用reset_index
,join
和set_index
:
join
答案 2 :(得分:1)
使用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