我有这个excel公式:

=IF(L2="","",IF(COUNTIF($L$1:L2,L2)=1,"1YR",IF(COUNTIF($L$1:L2,L2)=2,"3YR","5YR")))


将其翻译成带有熊猫的软件。此countif是一个棘手的问题,因为如果当前单元格中的值出现在其中,则仅需要检查并计数当前单元格上方的先前单元格。

当前解决方案:

df['year'] = np.where(df['company_id'] is None, None,
                np.where(pd.cut(df['company_id'], df.loc[df['company_id']].index[0]).count() == 1, '1YR',
               np.where(pd.cut(df.company_id, df.loc[df['company_id']].index[0]).count() == 2, '3YR', '5YR')))


所需的输出:

company_id  year
48299       1YR
48752       1YR
48865       1YR
48299       3YR
49503       1YR
48299       5YR
49697       1YR
50267       1YR
50714       1YR
50714       3YR
51050       1YR


使用pandas.cut函数,但我认为这不是解决此问题的正确方法。朝正确方向的任何帮助将不胜感激。

最佳答案

通过字典将cumcountmap用作计数器:

d = {0:'1YR', 1:'3YR', 2: '5YR'}
df['new'] = df.groupby(['company_id']).cumcount().map(d)
print (df)
    company_id year  new
0        48299  1YR  1YR
1        48752  1YR  1YR
2        48865  1YR  1YR
3        48299  3YR  3YR
4        49503  1YR  1YR
5        48299  5YR  5YR
6        49697  1YR  1YR
7        50267  1YR  1YR
8        50714  1YR  1YR
9        50714  3YR  3YR
10       51050  1YR  1YR

09-16 00:08