Вот один из возможных подходов, который избегает использования apply
Сырье DataFrame
date tableNameFrom tableNameJoin attributeName
0 29-03-2019 film language [film.languageId, language.languageID]
1 30-03-2019 inventory rental [invetory.inventoryId, rental.filmId]
Шаг 1 - (1) разбить attributeName
на 2 отдельных столбца, используя ,
в качестве разделителя, (2) удалить ненужные квадратные скобки ([
или ]
), (3) удалить ненужные столбцы
# 1
df[['tableName','attributeName2']] = df['attributeName'].str.split(',', expand=True)
# 2
df['tableName'] = df['tableName'].str.strip('[')
df['attributeName2'] = df['attributeName2'].str.strip(']')
# 3
df.drop(['attributeName','tableNameFrom','tableNameJoin'], axis=1, inplace=True)
print(df)
date tableName attributeName2
0 29-03-2019 film.languageId language.languageID
1 30-03-2019 invetory.inventoryId rental.filmId
Шаг 2 - Наконец, используйте этот пост SO , чтобы разбить строки из столбцов tableName
и attributeName2
на отдельные столбцы
df_match = (df.set_index(['date'])
.stack()
.str.split('.', expand=True)
.stack()
.unstack(-1)
.reset_index(-1, drop=True)
.reset_index()
)
df_match.columns = ['date','tableName','attributeName']
print(df_match)
date tableName attributeName
0 29-03-2019 film languageId
1 29-03-2019 language languageID
2 30-03-2019 invetory inventoryId
3 30-03-2019 rental filmId
информация
.set_index(['date']
- установить столбцы, которые должны быть сохранены в качестве индекса DataFrame
.stack()
- стек строк
.str.split('.', expand=True)
- вызвать str.split по периоду (.
), чтобы разбить эти ячейки на отдельные столбцы
.stack()
- избавиться от NULL
значений, поэтому снова вызвать stack
.unstack(-1)
- , так как мы хотим, чтобы последний уровень индекса стал нашими столбцами, поэтому отмените стек, используя
unstack(-1)
(отмените стек на последнем уровне)
- Я показал это подробно ниже 1
.reset_index(-1, drop=True)
- устранить лишний последний уровень, используя reset_index(-1)
1 Вот вывод перед шагом .unstack(-1)
и объяснение того, почему нам нужно использовать -1
внутри unstack()
df_intermediate = (df.set_index(['date'])
.stack()
.str.split('.', expand=True)
.stack()
)
print(df_intermediate)
date
29-03-2019 tableName 0 film
1 languageId
attributeName2 0 language
1 languageID
30-03-2019 tableName 0 invetory
1 inventoryId
attributeName2 0 rental
1 filmId
dtype: object
- это показывает, что мы хотим, чтобы последний уровень индекса (со значениями 0, 1) стал столбцами, поэтому мы выбираем
-1
в .unstack(-1)