加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在两列上使用pandas进行分解

发布时间:2020-12-20 12:02:19 所属栏目:Python 来源:网络整理
导读:我在pandas数据框中有一些看起来像这样的数据; CAR_TYPE MILEAGEFORD 100 FORD 100 FORD 200 FORD 300VW 100 VW 150VW 150VW 300 我想“分解”数据以返回每对的唯一ID.但是我希望将独特的ID“重置”为零,以便单独制作汽车.目前我的分解使用如下; df['CAR_ID'
我在pandas数据框中有一些看起来像这样的数据;

CAR_TYPE   MILEAGE
FORD       100     
FORD       100    
FORD       200    
FORD       300
VW         100     
VW         150
VW         150
VW         300

我想“分解”数据以返回每对的唯一ID.但是我希望将独特的ID“重置”为零,以便单独制作汽车.目前我的分解使用如下;

df['CAR_ID']=pd.factorize(pd.lib.fast_zip([df.CAR_TYPE.values,df.MILEAGE.values]))[0] 
df.CAR_ID=df[['CAR_ID','CAR_TYPE']].astype(str).apply(lambda x: ''.join(x),axis=1)

给我一些类似的东西

CAR_TYPE   MILEAGE     CAR_ID  
FORD       100         FORD0
FORD       100         FORD0
FORD       200         FORD1
FORD       300         FORD2
VW         100         VW3
VW         150         VW4
VW         150         VW4
VW         300         VW5

理想情况下,我想

CAR_TYPE   MILEAGE     IDEAL_CAR_ID  
FORD       100         FORD0
FORD       100         FORD0
FORD       200         FORD1
FORD       300         FORD2
VW         100         VW0
VW         150         VW1
VW         150         VW1
VW         300         VW2

为一个相对愚蠢的问题道歉,经过漫长的一天后,他的斗智斗勇.我知道它可以用stack / unstack,reset_index / set_index解决.

解决方法

如果MILEAGE中的值按组排序,则可以将 groupbyrank一起使用:

a = df.groupby(['CAR_TYPE'])['MILEAGE'].rank(method='dense') 
      .sub(1).astype(int).astype(str)
df['IDEAL_CAR_ID'] = df['CAR_TYPE'].add(a)
print (df)

  CAR_TYPE  MILEAGE IDEAL_CAR_ID
0     FORD      100        FORD0
1     FORD      100        FORD0
2     FORD      200        FORD1
3     FORD      300        FORD2
4       VW      100          VW0
5       VW      150          VW1
6       VW      150          VW1
7       VW      300          VW2

factorize的另一个解决方案:

a = df.groupby(['CAR_TYPE'])['MILEAGE'] 
       .transform(lambda x: pd.factorize(x)[0]).astype(str)
df['IDEAL_CAR_ID'] = df['CAR_TYPE'].add(a)
print (df)
  CAR_TYPE  MILEAGE IDEAL_CAR_ID
0     FORD      100        FORD0
1     FORD      100        FORD0
2     FORD      200        FORD1
3     FORD      300        FORD2
4       VW      100          VW0
5       VW      150          VW1
6       VW      150          VW1
7       VW      300          VW2

如果列未排序,则输出不同:

print (df)
  CAR_TYPE  MILEAGE
0     FORD      500
1     FORD      500
2     FORD      200
3     FORD      300
4       VW      100
5       VW      150
6       VW      150
7       VW      300

a = df.groupby(['CAR_TYPE'])['MILEAGE'].rank(method='dense') 
      .sub(1).astype(int).astype(str)
df['IDEAL_CAR_ID'] = df['CAR_TYPE'].add(a)
print (df)
  CAR_TYPE  MILEAGE IDEAL_CAR_ID
0     FORD      500        FORD2
1     FORD      500        FORD2
2     FORD      200        FORD0
3     FORD      300        FORD1
4       VW      100          VW0
5       VW      150          VW1
6       VW      150          VW1
7       VW      300          VW2
a = df.groupby(['CAR_TYPE'])['MILEAGE'] 
       .transform(lambda x: pd.factorize(x)[0]).astype(str)
df['IDEAL_CAR_ID'] = df['CAR_TYPE'].add(a)
print (df)
  CAR_TYPE  MILEAGE IDEAL_CAR_ID
0     FORD      500        FORD0
1     FORD      500        FORD0
2     FORD      200        FORD1
3     FORD      300        FORD2
4       VW      100          VW0
5       VW      150          VW1
6       VW      150          VW1
7       VW      300          VW2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读