根据分组将元素列表追加为数据框中的行

0 投票
1 回答
28 浏览
提问于 2025-04-14 16:30

我有两个叫做 dflegend 的数据框:

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

如果我理解正确的话,explodemergeconcat 这几个功能:

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

撰写回答