在熊猫数据帧的子集上执行np更新

时间:2019-05-24 19:16:10

标签: python pandas numpy

我有一个看起来像这样的数据框:

     Name    Flag  Other cols
0     Bob     N
1     Jack    N
2     Mike    Y
3     Mike    Y
4     Jack    Y

我想基于Flag用0或1更新特定的名称。这是我尝试过的代码行

df[df['Name'] == 'Jack']['Name'] = np.where(df[df['Name'] == 'Jack']['Flag'].isin(['Y']), '0', '1')

我希望返回:

     Name    Flag  Other cols
0     Bob     N
1     1       N
2     Mike    Y
3     Mike    Y
4     0       Y

因此,在这种情况下,如果名称为Jack且Flag为Y,则我希望Jack更新为0,否则更新为1。

例如,当我不尝试指定要更改的名称时,代码可以正常工作

df['Name'] = np.where(df['Flag'].isin(['Y']), '0', '1')

导致:

     Name   Flag  Other cols
0     1      N
1     1      N
2     0      Y
3     0      Y
4     0      Y

没有抛出任何错误,只是由于某种原因数据帧未得到更新。

我还尝试打印np.where()部分,它返回正确的0和1数组,所以看起来也不是问题。

2 个答案:

答案 0 :(得分:2)

执行此操作时会出现警告:

In [11]: df[df['Name'] == 'Jack']['Name'] = np.where(df[df['Name'] == 'Jack']['Flag'].isin(['Y']), '0', '1')
/Users/hayd/.miniconda3/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

解释了为什么不更新df。

并建议您按以下方式使用loc:

In [12]: df.loc[df['Name'] == 'Jack', 'Name'] = np.where(df[df['Name'] == 'Jack']['Flag'].isin(['Y']), '0', '1')

In [13]: df
Out[13]:
   Name Flag
0   Bob    N
1     1    N
2  Mike    Y
3  Mike    Y
4     0    Y

答案 1 :(得分:1)

这将起作用:

df.loc[df['Name'] == 'Jack', 'Name'] = np.where(df[df['Name'] == 'Jack']['Flag'].map(df['Flag']=='Y'), '0', '1')