我有三列我正在尝试更新值。逻辑是:如果列中的某个特定行为空,我想将其更改为n
而不是{{ 1}}。如果它中有值,那么我想将该值更改为None
。一个例子如下:
y
我一直在尝试执行类似下面代码的操作,但我收到消息Current data:
barcode dash_1 dash_2 dash_3
ABC123 ABC123 ABC123 None
ABC124 ABC124 ABC124 ABC124
ABC125 None ABC125 ABC125
ABC126 ABC126 None None
Desired output:
barcode dash_1 dash_2 dash_3
ABC123 y y n
ABC124 y y y
ABC125 n y y
ABC126 n n n
对象没有属性str
。我有什么想法,我做错了什么?谢谢!
isnull
答案 0 :(得分:4)
您可以使用df.notnull()
和df.isnull()
设置所有值:
df[df.notnull()] = 'y'
df[df.isnull()] = 'n'
示例:
>>> df
barcode dash_1 dash_2 dash_3
0 ABC123 ABC123 ABC123 None
1 ABC124 ABC124 ABC124 ABC124
2 ABC125 None ABC125 ABC125
3 ABC126 ABC126 None None
现在:
>>> df[df.notnull()] = 'y'
>>> df[df.isnull()] = 'n'
>>> df
barcode dash_1 dash_2 dash_3
0 y y y n
1 y y y y
2 y n y y
3 y y n n
答案 1 :(得分:4)
#df.iloc[:, cols].isnull() if you have nan, you can use this , thanks for juanpa
df.iloc[:,1:]=np.where(df.iloc[:,1:]!='None','Y','N')
df
Out[1270]:
barcode dash_1 dash_2 dash_3
0 ABC123 Y Y N
1 ABC124 Y Y Y
2 ABC125 N Y Y
3 ABC126 Y N N
答案 2 :(得分:2)
以下解决方案不会触及None
列中的NaN
/ barcode
:
In [102]: df.update(df.filter(regex='^dash_').notnull().replace({True:'y',False:'n'}))
In [103]: df
Out[103]:
barcode dash_1 dash_2 dash_3
0 ABC123 y y n
1 ABC124 y y y
2 ABC125 n y y
3 ABC126 y n n
答案 3 :(得分:1)
您应该使用数组方法和pandas函数。但是,您当前的错误是您在单个值上使用pandas数组方法isnull()
。应该说row[col] == np.nan
。
以下是pandas方式替代整个代码块:
将numpy导入为np
for col in ['dash_1','dash_2','dash_3']:
barcodes2[col] = np.where(barcodes2[col] == np.nan,'y','n')
答案 4 :(得分:0)
您不需要逐行迭代。 试试这个
for col in ['dash_1','dash_2','dash_3']:
barcodes2.col = np.where(barcodes2.col,"y","n")