我正在尝试通过考虑前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
答案 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