ValueError:无法从重复轴重新索引

ytk*_*ytk 2 python pandas

假设我有两个数据帧:

import string
import pandas as pd

d = {'one': pd.Series(range(26), index = list(string.ascii_lowercase)),
     'two': pd.Series([1., 2., 3., 4.], index = ['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

d2 = {'one': pd.Series(range(10), index = range(11, 21))}
df2 = pd.DataFrame(d2)
Run Code Online (Sandbox Code Playgroud)

现在,我有一个索引列表:

np.random.seed(12)
i = np.random.choice(np.arange(11, 21), size = 26)
Run Code Online (Sandbox Code Playgroud)

现在,我想加入df2df1基于i.

df['new_col'] = df2['one'][i]
Run Code Online (Sandbox Code Playgroud)

但是我得到了上面提到的错误.解决这个问题的一种方法是i直接添加df1,并创建一个名为iin 的列df2来表示index,然后执行a merge但看起来非常低效.有一个更好的方法吗?

我知道有几个问题有相同的标题,但没有一个对我的案例有任何帮助.

Ant*_*pov 5

您可以使用tolist方法将您转换df2.one为列表,然后将其分配给df['new_col']:

df['new_col'] = df2['one'][i].tolist()
Run Code Online (Sandbox Code Playgroud)

编辑

或者您可以.values在评论中使用属性作为@ajcr更快:

df['new_col'] = df2['one'][i].values
Run Code Online (Sandbox Code Playgroud)

定时

In [100]: %timeit df2.one[i].tolist()
1000 loops, best of 3: 275 µs per loop

In [101]: %timeit df2.one[i].values
1000 loops, best of 3: 252 µs per loop
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`.values`,即`df ['new_col'] = df2.loc [i,'one'].values`.创建列表比在此创建数组更昂贵. (2认同)