У меня есть DataFrame, который выглядит как пример ниже.
# define DataFrame for reproducability
df = pd.DataFrame({'date': ['2019-05-06', '2019-05-07', '2019-05-07', '2019-05-09', '2019-05-10', '2019-05-11'],
'Identifier': [1, 1, 1, 1, 1, 1],
'B': [2.4, 3.9, 3.9, 4.3, 2.5, 3.14],
'C': [0.214, 0.985, 0.985, 0.839, 0.555, 0.159],
'Name': [np.nan, "CD", "AD", np.nan, np.nan, np.nan]})
print(df)
date Identifier B C Name
0 2019-05-06 1 2.40 0.214 NaN
1 2019-05-07 1 3.90 0.985 CD
2 2019-05-07 1 3.90 0.985 AD
3 2019-05-09 1 4.30 0.839 NaN
4 2019-05-10 1 2.50 0.555 NaN
5 2019-05-11 1 3.14 0.159 NaN
Что можно видеть, так это то, что для данного идентификатора может быть более чем одним именем. Однако имя добавляется в DataFrame только один раз за одну дату. Что мне нужно, так это отправлять и заполнять имена на каждую дату. В настоящее время у меня есть решение, которое работает, но оно очень медленное для полного кадра данных, над которым я работаю. Код показан ниже
final_df = pd.DataFrame()
for i in df.Identifier.unique():
# select the current identifier
identifier_df = df.loc[df.Identifier == i]
# allow a given identifier to have different names
for n in df.Name.unique():
if pd.isna(n):
continue
else:
intermediate = identifier_df.copy()
intermediate.loc[:,"Name"] = np.repeat(n, len(intermediate))
final_df = final_df.append(intermediate)
final_df = final_df.drop_duplicates()
Обратите внимание, что циклические идентификаторы требуются для моего полного DataFrame. В этом случае, однако, это кажется довольно бессмысленным. Этот код, тем не менее, приводит к следующему кадру данных (именно так я и хотел бы выводить):
print(final_df)
date Identifier B C Name
0 2019-05-06 1 2.40 0.214 CD
1 2019-05-07 1 3.90 0.985 CD
3 2019-05-09 1 4.30 0.839 CD
4 2019-05-10 1 2.50 0.555 CD
5 2019-05-11 1 3.14 0.159 CD
0 2019-05-06 1 2.40 0.214 AD
1 2019-05-07 1 3.90 0.985 AD
3 2019-05-09 1 4.30 0.839 AD
4 2019-05-10 1 2.50 0.555 AD
5 2019-05-11 1 3.14 0.159 AD
Есть ли способ выполнить эту операцию с групповым или есть другой способ сделать это быстрее?
Спасибо!