熊猫剪——不同的箱子贴不同的标签



我有一个数据帧,它有两个不同的标签,a和B,以及一个相关的数值。我想添加一列,给出数值所在的自定义bin的标签,这可以用pd.cut((实现,如下所示:

df = pd.DataFrame({"label": ['A','A','A','A','A','A','B','B','B','B'],
"num":   [ 1 , 2 , 4 , 5 , 10, 11, 1 , 3 , 4 , 5 ]})
df['Bin'] = pd.cut(df["num"],
[0, 4.5, 7.5, np.inf],
labels=['0-4', '5-8', '>8'],
include_lowest=True)

给予:

label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-4
7     B    3  0-4
8     B    4  0-4
9     B    5  5-8

然而,这对A来说效果很好,但B的值是这样的,大多数值都会落入底部仓中,所以我想增加A和B的不同仓的分辨率,以产生以下结果:

label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-2
7     B    3  2-4
8     B    4  2-4
9     B    5   >4

感觉这应该是可能的,使用一个条件,比如df.where(),或者可能是一个带有transform()apply()groupby,或者是带有if的列表理解,但我一直在读stackoverflow,整天无所事事,没有取得任何成就。

我想我可以基于label将其分离为单独的数据帧,对该子数据图执行自定义cut,然后将结果重新连接在一起,但这感觉不太像Python,也不适合通用代码。

PS-这是一个最小的例子,我的真实数据帧有更多的label值,我希望将其保留为具有不同仓的单个数据帧,以便在代码中进行进一步处理,因此不会基于label将其分离为两个单独的数据帧。

是的,groupby().apply()是一个不错的选择,例如,您可以执行:

df['Bin'] = df.groupby('label')['num'].apply(pd.cut,bins=3)

输出:

label  num             Bin
0     A    1   (0.99, 4.333]
1     A    2   (0.99, 4.333]
2     A    4   (0.99, 4.333]
3     A    5  (4.333, 7.667]
4     A   10   (7.667, 11.0]
5     A   11   (7.667, 11.0]
6     B    1  (0.996, 2.333]
7     B    3  (2.333, 3.667]
8     B    4    (3.667, 5.0]
9     B    5    (3.667, 5.0]

或者,如果你为每个label都有一个特定的仓/标签映射,你可以这样做:

bins = {'A': [0,4.5,7.5, np.inf], 'B': [0,2.5,4.5,np.inf]}
labels={'A':['0-4', '5-8', '>8'], 'B': ['0-2','2-4','>4']}
def my_cut(data, bins, labels):
label = data['label'].iloc[0]
return pd.cut(data['num'], bins=bins[label], labels=labels[label])
df['Bin'] = df.groupby('label', group_keys=False).apply(my_cut, bins=bins, labels=labels)

输出:

label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-2
7     B    3  2-4
8     B    4  2-4
9     B    5   >4

最新更新