如何在Pandas中根据条件为数据框子集的列分配值?



我有一个数据帧:

df = pd.DataFrame([[0,4,0,0],
[1,5,1,0],
[2,6,0,0],
[3,7,1,0]], columns=['index', 'A', 'class', 'label'])
p>
标签th>0000

pandas.DataFrame.groupby'class',取'A'每组的groupby.mean,检查boolean系列astype(int)是否大于df['A'].mean(),pandas.Series.map是否大于df['class']并分配给df['label']:

>>> df['label'] = df['class'].map(
df.groupby('class')['A'].mean() > df['A'].mean()
).astype(int)
>>> df
index  A  class  label
0      0  4      0      0
1      1  5      1      1
2      2  6      0      0
3      3  7      1      1

由于您只检查class== 0,您需要在df['class']上添加另一个boolean mask:

>>> df['label'] = (df['class'].map(
df.groupby('class')['A'].mean() > df['A'].mean()
) & (~df['class'].astype(bool))
).astype(int)
index  A  class  label
0      0  4      0      0
1      1  5      1      0   # because (5+7)/2 < (4+5+6+7)/4
2      2  6      0      0
3      3  7      1      0   # because (5+7)/2 < (4+5+6+7)/4

所以即使你的代码工作了,你也不会知道,因为条件没有得到满足。

如果我理解正确,如果您提到的条件被满足,那么所有行的标签都更改为1对吗?在这种情况下,你所做的是正确的,但你遗漏了一些东西,代码应该是这样的:

if df[df['class'] == 0]['A'].mean() > df['A'].mean:
df['label'] = 1

这应该可以工作。您所做的工作不工作,因为当您使用df[df['class']]时,您只选择了DataFrame的'class'列,因此您要修改的'label'列不称为

最新更新