我有一个看起来像这样的数据框:
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数组,所以看起来也不是问题。
答案 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')