根据优先级在pandas数据帧中创建二进制列

问题描述 投票:3回答:3

我有一个像这样的pandas数据框:

Item    Status
123     B
123     BW
123     W 
123     NF
456     W
456     BW
789     W
789     NF
000     NF

我需要创建一个新的列Value,它将是1或0,具体取决于ItemStatus列中的值。值1的赋值按此顺序排列优先顺序:BBWWNF。因此,使用上面的示例数据框,结果应该是:

Item    Status    Value
123     B         1
123     BW        0
123     W         0
123     NF        0
456     W         0
456     BW        1
789     W         1
789     NF        0
000     NF        1

使用Python 3.7。

python python-3.x pandas dataframe
3个回答
2
投票

将原始数据帧作为输入df数据帧,以下代码将生成所需的输出:

#dictionary assigning order of priority to status values
priority_map = {'B':1,'BW':2,'W':3,'NF':4}

#new temporary column that converts Status values to order of priority values
df['rank'] = df['Status'].map(priority_map)

#create dictionary with Item as key and lowest rank value per Item as value
lowest_val_dict = df.groupby('Item')['rank'].min().to_dict()

#new column that assigns the same Value to all rows per Item
df['Value'] = df['Item'].map(lowest_val_dict)

#replace Values where rank is different with 0's
df['Value'] = np.where(df['Value'] == df['rank'],1,0)

#delete rank column
del df['rank']

1
投票

我更喜欢一种方法,其状态是有序的pd.Categorical,因为a)它是什么,b)它更具可读性:如果你有,你只需比较一个值是否等于其组的max

df['Status'] = pd.Categorical(df['Status'], categories=['NF', 'W', 'BW', 'B'],
                              ordered=True)
df['Value'] = df.groupby('Item')['Status'].apply(lambda x: (x == x.max()).astype(int))

#   Item Status  Value
#0   123      B      1
#1   123     BW      0
#2   123      W      0
#3   123     NF      0
#4   456      W      0
#5   456     BW      1
#6   789      W      1
#7   789     NF      0
#8     0     NF      1

0
投票

通过解释我会做的一些步骤,我或许可以从概念上帮助你:

  1. 创建新列Value,并用零np.zeros()pd.fillna()填充它
  2. 使用groupby = pd.groupby('Item')按Item对数据帧进行分组
  3. 迭代所有组成的for name, group in groupby:
  4. 通过使用if的简单函数,自定义优先级队列,自定义排序条件或任何其他首选方法,确定哪个条目具有更高的优先级“通过此值1优先于此顺序:B,BW,W,NF”,以及为其值列group.loc[entry]['Value'] == 0指定值1 假设我们正在关注'123'组: Item Status Value ------------------------- 123 B 0 (before 0, after 1) 123 BW 0 123 W 0 123 NF 0 因为行[123, 'B', 0]根据您的标准具有最高优先级,您将其更改为[123, 'B', 1]
  5. 完成后,从groupby对象创建数据帧,然后就完成了。你有很多可能做到这一点,可以在这里查看:Converting a Pandas GroupBy object to DataFrame
© www.soinside.com 2019 - 2024. All rights reserved.