在熊猫列中将前N行与当前行进行比较

时间:2019-06-13 03:33:34

标签: python pandas dataframe

我正在尝试通过考虑前n行的值在熊猫数据框中填充新列。如果当前值不等于该列中过去的n个值,则应填充“ N”,否则填充“ Y”。

请让我知道实现这一目标的好方法。

这是我的输入数据:

testdata = {'col1' :['car','car','car','bus','bus','bus','car']}
df = pd.DataFrame.from_dict(testdata)

输入DF:

  col1
0  car
1  car
2  car
3  bus
4  bus
5  car  
6  car

输出DF(n = 2):

  col1   Result
0  car         
1  car         
2  car      Y  
3  bus      N  
4  bus      Y  
5  bus      Y  
6  car      N 

2 个答案:

答案 0 :(得分:2)

您可以通过Rolling.apply调用来做到这一点。

n = 2
res = (df['col1'].astype('category')
                 .cat.codes
                 .rolling(n+1)
                 .apply(lambda x: x[-1] in x[:-1], raw=True))

df['Result'] = np.where(res == 1, 'Y', 'N')
df

  col1 Result
0  car      N
1  car      N
2  car      Y
3  bus      N
4  bus      Y
5  bus      Y
6  car      N

滚动仅适用于数字数据,因此第一步是将其分解。这可以通过多种方式完成,我使用了astype('category'),然后提取了代码。


另一个选择是使用pd.Categorical进行转换,

res = (df.assign(col1=pd.Categorical(df['col1']).codes)['col1']
         .rolling(n+1)
         .apply(lambda x: x[-1] in x[:-1], raw=True))

df['Result'] = res.map({1: 'Y', 0: 'N'})
df

  col1 Result
0  car    NaN
1  car    NaN
2  car      Y
3  bus      N
4  bus      Y
5  bus      Y
6  car      N

答案 1 :(得分:2)

这是我的方式

n=2
l=[False]*n+[df.iloc[x,0] in df.iloc[x-n:x,0].tolist() for x in np.arange(n,len(df))]
df['New']=l
df
  col1    New
0  car  False
1  car  False
2  car   True
3  bus  False
4  bus   True
5  bus   True
6  car  False