我有一个看起来像这样的DataFrame:
我想为每一行找到previous
列中当前行的current
值之间的匹配索引,这样我得到了一个名为idx_previous
的新序列,如下所示:如下:
到目前为止,我已经尝试使用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
是元素current
中N-1
中的字符串。 current
由所有唯一值组成。
答案 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
。