python - 在两列上使用 Pandas 分解

标签 python python-3.x pandas

我在 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 来解决。

最佳答案

您可以使用 groupbyrank如果 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/

相关文章:

c# - 代码中的数据库驱动程序规范

python - 从 '_io.BytesIO' 转换为 python3.6 中的类字节对象?

python - 为什么 'Extended Iterable Unpacking' 不适用于空字符串?

python - "TypeError: data type not understood"比较数据类型 np.datetime64

python - 使用 pandas 更新两个具有相同 key 的相似 csv 文件

python - 尾随定界符混淆了 pandas read_csv

python - 用于将特定规模的志愿者团体与要求特定数量的志愿者的志愿者站点进行最佳匹配的算法?

python - 代码执行它在 python 中的方式的未知原因

audio - 播放wav文件python 3

python 和 Pandas 。如何使用 TextFileReader 对象中 "chunks"的子集?