熊猫-创建新列并根据过滤器分配值

时间:2020-08-19 08:55:27

标签: python pandas dataframe

说我有一个数据框

id  category
1   A        
2   A
3   B
4   C
5   A

我想在其中category == 'A'处创建一个具有增量值的新列。所以应该是这样。

id  category  value
1   A         1
2   A         2
3   B         NaN
4   C         NaN
5   A         3

目前,我能够做到

df['value'] = pd.nan
df.loc[df.category == "A", ['value']] = range(1, len(df[df.category == "A"]) + 1)

是否有更好的/ python方式(例如,我不必用nan初始化value列?),当前,此方法为我分配了一个浮点类型,而不是我想要的整数。

2 个答案:

答案 0 :(得分:0)

如果默认值为value,则不必NaN列进行初始化;如果创建时没有[],则也使用sum来表示掩码的计数值:

m = df.category == "A"
df.loc[m, 'value'] = range(1, m.sum() + 1)
df['value'] = df['value'].astype('Int64')

print (df)

0   1        A      1
1   2        A      2
2   3        B   <NA>
3   4        C   <NA>
4   5        A      3

如果还需要设置为可为空的整数:

m = df.category == "A"
df['value'] = m.cumsum().where(m).astype('Int64')
print (df)
   id category  value
0   1        A      1
1   2        A      2
2   3        B   <NA>
3   4        C   <NA>
4   5        A      3

答案 1 :(得分:0)

另一种方式可能是

df['value'] = df['category'].eq('A').cumsum()
df['value'][df['category']!='A'] = pd.NA