Настройка
df = pd.DataFrame()
df['ID'] =[ np.nan, 2,4, np.nan,8, np.nan ,'16-18',25, '30-31']
Затем сначала создайте "ID"
для диапазонов
s = df.ID.str.split("-")
s2 = s[s.notna()].apply(lambda x: ("ID "+pd.Series(list(range(int(x[0]), int(x[1])+1))).astype(str)).tolist())
, а затем для обычных случаев (кроме NaN и диапазонов)
non_na = df.ID[df.ID.notna()]
non_na_range = non_na[~non_na.index.isin(s2.index)]
s3 = "ID " + non_na_range.astype(str)
Затем присвойте
df.loc[s2.index, "ID"] = s2
df.loc[s3.index, "ID"] = s3
выход
ID
0 NaN
1 ID 2
2 ID 4
3 NaN
4 ID 8
5 NaN
6 [ID 16, ID 17, ID 18]
7 ID 25
8 [ID 30, ID 31]