#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
Я хотел бы получить совпадения из одного столбца с другими столбцами в фрейме данных. Столбец атрибута представляет собой список. Ниже приведен пример:
date tableNameFrom tableNameJoin attributeName
1 29-03-2019 film language [film.languageId, language.languageID, film.filmID]
2 30-03-2019 inventory as i rental as r [i.inventoryId, r.filmId]
Это то, что я пробовал:
df1 = (pd.DataFrame(df['attribute'].values.tolist())
.stack()
.str.split('.', expand=True)
.reset_index(drop=True))
df1.columns = ['tableName','attributeName']
print(df1)
И результат, который я получил:
tableName attributeName
1 film languageId
2 language languageID
3 film filmId
Вот желаемый результат:
date tableName attributeName
1 29-03-2019 film languageId
2 29-03-2019 language languageID
3 29-03-2019 film filmId
4 30-03-2019 inventory inventoryId
5 30-03-2019 rental filmId
Есть идеи, что мне делать? Спасибо за помощь.
Ответ №1:
Сначала создайте словарь с помощью Series.str.split
by as
для dictionary:
df3 = df[['tableNameFrom','tableNameJoin']].stack().str.split(' as ', expand=True).dropna()
d = dict(zip(df3[1], df3[0]))
print (d)
{'i': 'inventory', 'r': 'rental'}
Добавьте параметр индекса в DataFrame
конструктор и удалите последний reset_index
:
df1 = (pd.DataFrame(df['attributeName'].values.tolist(), index=df.index)
.stack()
.str.split('.', expand=True))
df1.columns = ['tableName','attributeName']
print(df1)
tableName attributeName
1 0 film languageId
1 language languageID
2 film filmID
2 0 i inventoryId
1 r filmId
Выберите только столбец date
и DataFrame.join
создать DataFrame
:
df2 = df[['date']].join(df1.reset_index(level=1, drop=True))
И последнее Series.replace
по словарю:
df2['tableName'] = df2['tableName'].replace(d)
df2 = df2.reset_index(drop=True)
print (df2)
date tableName attributeName
0 29-03-2019 film languageId
1 29-03-2019 language languageID
2 29-03-2019 film filmID
3 30-03-2019 inventory inventoryId
4 30-03-2019 rental filmId
Комментарии:
1. Использовать
df1 = (pd.DataFrame(da['attributeName'].values.tolist(), index=da.index)
2. что, если в строке нет tableNameJoin, поэтому есть только tableNameFrom и attributeName ? Я попробовал, и имя атрибута стало именем таблицы
3. @jesicagu — Не уверен, что понимаю, можете ли вы объяснить подробнее? лучший образец данных с ожидаемым результатом в новом вопросе. Спасибо.