Замена строки на значение, рассчитанное по максимуму другого столбца в кадре данных - PullRequest
1 голос
/ 10 марта 2020

У меня есть фрейм данных со столбцом идентификатора, который имеет объект dtype (так как содержит INT и STR), поэтому я пытаюсь использовать np.where для замены каждого из них по очереди на следующее наибольшее число ... Однако по какой-то причине в В приведенном ниже примере он заменяет только одну из 2 строк, и я понятия не имею, почему?

df = pd.DataFrame({'IDstr':['480610_ABC_087', '78910_ABC_087','4806105017087','414149'],
                       'IDint':[ 0, 0, 4806105017087, 414149]})
print (df)
unique_str_IDs = df['IDstr'][df['IDstr'].str.contains("ABC", na=False)].unique()
for i in range(len(unique_str_IDs)):
    df['SKUintTEST']=np.where(df['IDstr'] == unique_str_IDs[i].strip(), 
            df['SKUint_y'].max()+i+1, df['SKUint_y'])

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 10 марта 2020

Вы можете использовать map со словарем, созданным с инкрементами для каждого уникального идентификатора, затем fillna с исходным значением для строк, которые не отображаются:

df = pd.DataFrame({'IDstr':['480610_ABC_087', '78910_ABC_087','4806105017087','414149'],
                    'IDint':[ 0, 0, 4806105017087, 414149], 
                    'SKUint_y': range(10,14)})

unique_str_IDs = df.loc[df['IDstr'].str.contains("ABC", na=False), 'IDstr'].unique()

df['SKUintTEST'] = df['IDstr'].map({idx:i for i, idx in enumerate(unique_str_IDs, df.SKUint_y.max()+1)})\
                              .fillna(df.SKUint_y)

print (df)
            IDstr          IDint  SKUint_y  SKUintTEST
0  480610_ABC_087              0        10        14.0
1   78910_ABC_087              0        11        15.0
2   4806105017087  4806105017087        12        12.0
3          414149         414149        13        13.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...