为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2021-09-25 21:55:53
我正在尝试将我在 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    c0      1  asd  dsa  sad1      2  fgh  hgf  gfh2      3  qwe  ewq  wqedataframe2 = pd.DataFrame({'index':[1,1,2,3,3],'d':['zxc','cxz','xzc','zxc','xcz']})dataframe2=dataframe2[['index','d']]dataframe2   index    d0      1  zxc1      1  cxz2      2  xzc3      3  zxc4      3  xcz预期结果:index, a, b, c, d1, asd, dsa, sad, zxc1, nan, nan, nan, cxz2, fgh, hgf, gfh, xzc3, qwe, ewq, wqe, zxc3, nan, nan, nan, xcz有什么内置函数可以使用吗?这些值也可以只是具有相同索引的前一行的值。
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

使用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    c

0      1  zxc  asd  dsa  sad

1      1  cxz  NaN  NaN  NaN

2      2  xzc  fgh  hgf  gfh

3      3  zxc  qwe  ewq  wqe

4      3  xcz  NaN  NaN  NaN

细节


我们为“索引”中的重复值引入了累积计数。


u = df2.assign(cnt=df2.groupby('index').cumcount())

u

   index    d  cnt

0      1  zxc    0

1      1  cxz    1

2      2  xzc    0

3      3  zxc    0

4      3  xcz    1


v = df.assign(cnt=df.groupby('index').cumcount())

v

   index    a    b    c  cnt

0      1  asd  dsa  sad    0

1      2  fgh  hgf  gfh    0

2      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    c

0      1  zxc    0  asd  dsa  sad

1      1  cxz    1  NaN  NaN  NaN

2      2  xzc    0  fgh  hgf  gfh

3      3  zxc    0  qwe  ewq  wqe

4      3  xcz    1  NaN  NaN  NaN

最后一步是删除临时“cnt”列。


查看完整回答
反对 回复 2021-09-25
?
侃侃无极

TA贡献2051条经验 获得超10个赞

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    c

0      1  zxc  asd  dsa  sad

1      1  cxz  NaN  NaN  NaN

2      2  xzc  fgh  hgf  gfh

3      3  zxc  qwe  ewq  wqe

4      3  xcz  NaN  NaN  NaN


查看完整回答
反对 回复 2021-09-25
  • 2 回答
  • 0 关注
  • 272 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号