Pandas - 如果满足条件,则更新列

时间:2018-01-29 19:47:57

标签: python pandas

我有三列我正在尝试更新值。逻辑是:如果列中的某个特定行为空,我想将其更改为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

5 个答案:

答案 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")