猿问

如何匹配数据框中列之间的值

我想从数据框中的一列与其他列中获取匹配项。属性列是一个列表。下面是一个例子:


  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

知道我该怎么做吗?谢谢您的帮助。


陪伴而非守候
浏览 152回答 1
1回答

湖上湖

首先Series.str.split通过asfor 字典创建字典:df3 = df[['tableNameFrom','tableNameJoin']].stack().str.split(' as ',  expand=True).dropna()d = dict(zip(df3[1], df3[0]))print (d){'i': 'inventory', 'r': 'rental'}将 index 参数添加到DataFrame构造函数并删除 last reset_index:df1 = (pd.DataFrame(df['attributeName'].values.tolist(), index=df.index)                      .stack()                      .str.split('.', expand=True))df1.columns = ['tableName','attributeName']print(df1)    tableName attributeName1 0      film    languageId  1  language    languageID  2      film        filmID2 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 attributeName0  29-03-2019       film    languageId1  29-03-2019   language    languageID2  29-03-2019       film        filmID3  30-03-2019  inventory   inventoryId4  30-03-2019     rental        filmId
随时随地看视频慕课网APP

相关分类

Python
我要回答