假设我有两个数据帧:
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)
现在,我有一个索引列表:
np.random.seed(12)
i = np.random.choice(np.arange(11, 21), size = 26)
现在,我想基于df2
加入df1
i
。
df['new_col'] = df2['one'][i]
但是我得到了上面提到的错误。解决此问题的一种方法是直接将i
添加到df1
,并在i
中创建一个名为df2
的列来表示index
,然后执行此操作一个merge
但似乎非常低效。有更好的方法吗?
我知道有几个问题有相同的标题,但没有一个对我的案例有任何帮助。
答案 0 :(得分:5)
您可以使用tolist
方法将df2.one
转换为列表,然后将其分配给df['new_col']
:
df['new_col'] = df2['one'][i].tolist()
修改强>
或者您可以使用.values
属性作为评论中建议的@ajcr更快:
df['new_col'] = df2['one'][i].values
<强>时序强>
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
答案 1 :(得分:1)
设置索引以使用&#39; i&#39;中生成的值,然后根据该索引将df2连接到df:
df = df.set_index(i)
df['new_col'] = df2['one']