首页 > 解决方案 > 加入/合并相同的数据框以在熊猫中进行转换

问题描述

我尝试了解 panda join/merge 中的一些内容以及它是如何工作的,就我而言,我使用了这篇文章中的解决方案

所以我的输入:

dd = pd.DataFrame({
     'Frame':[0,0,31,31,49,49,49,49,49,49,52,54,101,101],
     'm_label':['BBPS','BBPS','Actions','Actions','BBPS','Findings','Findings','BBPS','Findings','Findings','TR','TR','Action','Action'],
     'details':['3','start','IR','start' ,'2', 'PL', 'end','end','DV','start','HP','SP','IR','end']})

我期望:

frame m_label         details
    0   Findings.DV   start
    0  Findings.DV    end   
    0   BBPS.3        start
    31  Actions.IR    start
    99 Action.IR      end
    99 Findings.PL    start
    99  Findings.PL   end
    99  BBPS.2        end
    52  TR.HP         HP
    54  TR.SP         SP
    101  Action.IR    end

因此,当我遵循解决方案并仅添加新标签“SP”、“HP”时:

detail_type = dd['details'].isin({'SP', 'HP', 'start', 'end'})
df_cv = pd.merge(dd[~detail_type], dd[detail_type].rename(columns={'details': 'detail_type'}))
df_cv = df_cv.drop(columns=['m_label', 'details']).join(df_cv['m_label'].str.cat(df_cv['details'], sep='.'))

输出错误 - 例如它仅适用于“开始”和“结束”标签,但值detail_type工作良好(它的标签 True/False 也适用于 4 个标签)好的,我将新标签放在 diff 列表中,并且在此行代码中没有~pd.merge(data_cv[detail_type],如果我把它留在同一个地方输出会是错误的:

detail_type = dd['details'].isin(['SP','HP'])
df_dd = pd.merge(dd[detail_type], dd[detail_type].rename(columns={'details': 'detail_type'}))
df_dd = df_dd.drop(columns=['m_label', 'details']).join(df_dd['m_label'].str.cat(df_dd['details'], sep='.'))

对标签 'end' 和 'start' 重复相同的代码到不同的 df(现在​​使用~

detail_type = dd['details'].isin({'end','start'})
df_cv = pd.merge(dd[~detail_type], dd[detail_type].rename(columns={'details': 'detail_type'}))
df_cv = df_cv.drop(columns=['m_label', 'details']).join(df_cv['m_label'].str.cat(df_cv['details'], sep='.'))

最后,只需连接 df:

df_cv = pd.concat([df_dd,df_cv])

有点奇怪。我想,我错过了一些东西,不明白它到底是如何工作的。
我的问题,为什么它不能同时用于 4 个标签('end'、'start'、'hp'、'sp')以及代码中的~是什么意思pd.merge(dd[~detail_type]

谢谢。

标签: pythonpandasdataframe

解决方案


推荐阅读