根据分组将元素列表追加为数据框中的行
我有两个叫做 df
和 legend
的数据框:
df = pd.DataFrame({'object': ['dog', 'dog', 'cat', 'mouse'],
'personID': [1, 1, 2, 3],
'word': ['paw', 'head', 'whisker', 'tail'],
'included': [1, 1, 1, 1]})
legend = pd.DataFrame({'object': ['dog', 'cat', 'mouse'],
'word_lists': [
['paw', 'head', 'nose', 'body'],
['whisker', 'ears', 'eyes'],
['ears', 'tail', 'fur']]})
我想根据“对象”来添加“legend['word_lists']”里的单词。具体来说,我想把这些单词添加到通过 df.groupby(['object', 'person']) 分组后的每个对象和人上,这样每个组都会得到这些新单词。
我还在记录哪些单词最初包含在“df['included']”这一列中。所有新单词应该标记为0。以下是我想要的结果:
result_df = pd.DataFrame({
'object': ['dog', 'dog', 'dog', 'dog', 'dog','dog','cat', 'cat','cat','cat','mouse', 'mouse', 'mouse', 'mouse'],
'personID': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3],
'word': ['paw', 'head', 'paw', 'head', 'nose', 'body', 'whisker', 'whisker', 'ears', 'eyes', 'tail', 'ears', 'tail', 'fur'],
'included': [1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]})
1 个回答
0
如果我理解正确的话,explode
、merge
和 concat
这几个功能:
out = (pd.concat([
df,
legend
.explode('word_lists')
.rename(columns={'word_lists': 'word'})
.merge(df[['object', 'personID']].drop_duplicates())
.assign(included=0),
])
.sort_values(['personID', 'object'])
)
输出结果:
object personID word included
0 dog 1 paw 1
1 dog 1 head 1
0 dog 1 paw 0
1 dog 1 head 0
2 dog 1 nose 0
3 dog 1 body 0
2 cat 2 whisker 1
4 cat 2 whisker 0
5 cat 2 ears 0
6 cat 2 eyes 0
3 mouse 3 tail 1
7 mouse 3 ears 0
8 mouse 3 tail 0
9 mouse 3 fur 0