在下面的DataFrame中,即df1
In[0]: df1
Out[0]:
A B
first second
bar one 1.764052 0.400157
one 0.978738 2.240893
one 1.867558 -0.977278
two 0.950088 -0.151357我希望在MultiIndex ('bar','one')的最后一行之后追加另一个MultiIndex,同时给新添加的行提供相同的MultiIndex。
也就是说,对于下面的df2
In[1]: df2
Out[1]:
A B
first second
baz three -0.103219 0.410599
three 0.144044 1.454274预期的结果是:
A B
first second
bar one 1.764052 0.400157
one 0.978738 2.240893
one 1.867558 -0.977278
one -0.103219 0.410599 # there 2 rows
one 0.144044 1.454274 # arrived from df2
two 0.950088 -0.151357到目前为止,才是问题所在.
我前面的一些尝试都失败了:
(1)按组迭代(使用groupby)并根据df2值连接一个新的DataFrame:
for idx, data in df1.groupby(level=[0,1]):
df1.loc[idx] = pd.concat([data, pd.DataFrame(df2, index=idx)], ignore_index=True)
Exception: cannot handle a non-unique multi-index!(还尝试将它们放置在一个新的DataFrame__中)。
(2) 重编索引 df2优先:
for idx, data in df1.groupby(level=[0,1]):
df2.reindex(idx)
Exception: cannot handle a non-unique multi-index!或者:
for idx, data in df1.groupby(level=[0,1]):
df2.index = idx
break
A B
bar -0.103219 0.410599
one 0.144044 1.454274发布于 2016-08-18 15:11:23
如果您想要手动将数据插入到现有的dataframe中,则需要决定几件事。
('bar', 'one')的第一个实例来解决这个问题。position = (df1.index.to_series() == ('bar', 'two')).values.argmax()
pd.concat([
df1.iloc[:position],
df2.set_index([['bar', 'bar'], ['one', 'one']]),
df1.iloc[position:]
])

新行从前一行继承索引值的示例(结果与上面相同)
position = (df1.index.to_series() == ('bar', 'two')).values.argmax()
insert_idx = pd.MultiIndex.from_tuples(df1.index[[position - 1]].tolist() * len(df2))
pd.concat([
df1.iloc[:position],
df2.set_index(insert_idx),
df1.iloc[position:]
])https://stackoverflow.com/questions/39020493
复制相似问题