在第二列的每个匹配项的一个DataFrame列中查找索引

时间:2018-11-24 22:00:19

标签: python pandas dataframe match

我有一个看起来像这样的DataFrame:

enter image description here

我想为每一行找到previous列中当前行的current值之间的匹配索引,这样我得到了一个名为idx_previous的新序列,如下所示:如下:

enter image description here

到目前为止,我已经尝试使用Pandas.Series.where()函数查看位置。如果我这样做:

import pandas as pd
df = pd.DataFrame({'current':['a','aa','ab','aaa','aab','aba','abb'],
    'previous':['','a','a','aa','aa','ab','ab']})

df['idx_previous'] = ''
for previous in df.previous[1:]:
    df.loc[df.previous==previous, 'idx_previous'] = df.loc[df.current == 
previous].index[0]

我可以得到想要的东西,但这似乎是一个不优雅的解决方法。有什么方法更适合此任务吗?谢谢。

注意:根据定义,previous是元素currentN-1中的字符串。 current由所有唯一值组成。

1 个答案:

答案 0 :(得分:2)

您可以创建一个系列s,以颠倒df['current']的映射。然后将其与pd.Series.map一起使用:

s = pd.Series(df.index, index=df['current'].values)
df['idx_previous'] = df['previous'].map(s)

print(df)

  current previous  idx_previous
0       a                    NaN
1      aa        a           0.0
2      ab        a           0.0
3     aaa       aa           1.0
4     aab       aa           1.0
5     aba       ab           2.0
6     abb       ab           2.0

此解决方案依赖于df['current']的值唯一,否则您的要求不明确。此外,存在非映射值,例如由于NaN是一个df['idx_previous']值,因此第一行会导致float并强制NaN上载到float