在两列上使用pandas进行因子分解

2024-10-03 13:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pandas数据框中有一些数据,如下所示

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

我想对数据进行“因式分解”,为每对数据返回一个唯一的ID。不过,我希望唯一的身份证'重置'为零为单独的汽车制造。目前我的因式分解使用以下方法:

^{pr2}$

给了我一些像

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

为这个相对愚蠢的问题道歉,在漫长的一天之后。我知道可以用堆栈/取消堆栈、重置索引/设置索引来解决这个问题。在


Tags: 数据idpandas堆栈typecar重置vw
3条回答
f1 = pd.factorize(list(zip(df.CAR_TYPE.values, df.MILEAGE.values)))[0]
f0 = pd.factorize(df.CAR_TYPE.values)[0] \
    * (df.groupby('CAR_TYPE').CAR_TYPE.transform('count').values - 1)

df.assign(CAR_ID=df.CAR_TYPE.add((f1 - f0).astype(str)))

  CAR_TYPE  MILEAGE 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

如果MILEAGE中的值按组排序,则可以将^{}与{a2}一起使用:

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

另一个带有^{}的解决方案:

^{pr2}$

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

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

或者你可以试试这个。在

df['CAR_ID']=df.CAR_TYPE+df1.groupby('CAR_TYPE')['MILEAGE'].apply(lambda x:x.astype('category').cat.codes).astype(str)


Out[21]: 
  CAR_TYPE  MILEAGE 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

相关问题 更多 >