我在 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
对于相对愚蠢的问题,在漫长的一天之后机智地道歉。我知道它可以通过堆栈/取消堆栈、reset_index/set_index 来解决。
最佳答案
您可以使用 groupby
与 rank
如果 MILEAGE
中的值按组排序:
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
关于python - 在两列上使用 Pandas 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574616/