Как сопоставить значение между столбцами в фрейме данных

#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 — Не уверен, что понимаю, можете ли вы объяснить подробнее? лучший образец данных с ожидаемым результатом в новом вопросе. Спасибо.