Pandas 在重复键上加入但不增加列数

我正在尝试将我在 python 中导入的两个不同的数据帧与 Pandas 结合起来。它们是我做过的一些眼动追踪的结果。然而,其中一个包含用户注视的类和方法,这意味着对于每一行 dataframe1 有 dataframe2 有一个额外的。现在这不会发生在每一行中,所以我不能只复制行,但我的想法是每次 dataframe2 的索引有两个相同的索引时添加另一行。有点像这样:


dataframe1 = pd.DataFrame({'index':[1,2,3],'a':['asd','fgh','qwe'],'b':['dsa','hgf','ewq'],'c':['sad','gfh','wqe']})

dataframe1=dataframe1[['index','a','b','c']]

dataframe1

   index    a    b    c

0      1  asd  dsa  sad

1      2  fgh  hgf  gfh

2      3  qwe  ewq  wqe


dataframe2 = pd.DataFrame({'index':[1,1,2,3,3],'d':['zxc','cxz','xzc','zxc','xcz']})

dataframe2=dataframe2[['index','d']]

dataframe2

   index    d

0      1  zxc

1      1  cxz

2      2  xzc

3      3  zxc

4      3  xcz

预期结果:


index, a, b, c, d

1, asd, dsa, sad, zxc

1, nan, nan, nan, cxz

2, fgh, hgf, gfh, xzc

3, qwe, ewq, wqe, zxc

3, nan, nan, nan, xcz

有什么内置函数可以使用吗?这些值也可以只是具有相同索引的前一行的值。


噜噜哒
浏览 273回答 2
2回答

一只甜甜圈

使用pd.merge一个额外cumcounted列:u = df2.assign(cnt=df2.groupby('index').cumcount())v = df.assign(cnt=df.groupby('index').cumcount())u.merge(v, on=['index', 'cnt'], how='left').drop('cnt', 1)   index    d    a    b    c0      1  zxc  asd  dsa  sad1      1  cxz  NaN  NaN  NaN2      2  xzc  fgh  hgf  gfh3      3  zxc  qwe  ewq  wqe4      3  xcz  NaN  NaN  NaN细节我们为“索引”中的重复值引入了累积计数。u = df2.assign(cnt=df2.groupby('index').cumcount())u   index    d  cnt0      1  zxc    01      1  cxz    12      2  xzc    03      3  zxc    04      3  xcz    1v = df.assign(cnt=df.groupby('index').cumcount())v   index    a    b    c  cnt0      1  asd  dsa  sad    01      2  fgh  hgf  gfh    02      3  qwe  ewq  wqe    0然后我们u在“index”和“cnt”上强制执行 LEFT JOIN wrt 。这样,在结果中引入了 NaN:u.merge(v, on=['index', 'cnt'], how='left')   index    d  cnt    a    b    c0      1  zxc    0  asd  dsa  sad1      1  cxz    1  NaN  NaN  NaN2      2  xzc    0  fgh  hgf  gfh3      3  zxc    0  qwe  ewq  wqe4      3  xcz    1  NaN  NaN  NaN最后一步是删除临时“cnt”列。

侃侃无极

merge与mask和一起使用duplicated:df = df2.merge(df1)cols = ['index','a','b','c']df[['a','b','c']] = df[cols].mask(df[cols].duplicated())[['a','b','c']]print(df)   index    d    a    b    c0      1  zxc  asd  dsa  sad1      1  cxz  NaN  NaN  NaN2      2  xzc  fgh  hgf  gfh3      3  zxc  qwe  ewq  wqe4      3  xcz  NaN  NaN  NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python