Python 基于列值将nan设置为dataframe中的行

Python 基于列值将nan设置为dataframe中的行,python,pandas,Python,Pandas,使用: 数据帧类似于: import numpy as np import pandas as pd import matplotlib.pyplot as plt a = pd.read_csv('file.csv', na_values=['-9999.0'], decimal=',') a.index = pd.to_datetime(a[['Year', 'Month', 'Day', 'Hour', 'Minute']]) pd.options.mode.chained_assign

使用:

数据帧类似于:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

a = pd.read_csv('file.csv', na_values=['-9999.0'], decimal=',')
a.index = pd.to_datetime(a[['Year', 'Month', 'Day', 'Hour', 'Minute']])
pd.options.mode.chained_assignment = None
如果列上的值为9,而D列上的值同时为2,则主要目标是将np.nan设置为整行,例如:

产出期望

Index               A    B       C      D
2016-07-20 18:00:00 9   4.0     NaN    2
2016-07-20 19:00:00 9   2.64    0.0    3
2016-07-20 20:00:00 12  2.59    0.0    1
2016-07-20 21:00:00 9   4.0     NaN    2
如果有人能帮忙,我们将不胜感激。

试试这个:

Index               A    B       C      D
2016-07-20 18:00:00 NaN NaN     NaN    NaN
2016-07-20 19:00:00 9   2.64    0.0     3
2016-07-20 20:00:00 12  2.59    0.0     2
2016-07-20 21:00:00 NaN NaN     NaN    NaN
演示:

或者,我们可以使用以下方法:

使用,默认情况下创建
NaN
s:

In [174]: df = df.where(~(df.A.eq(9) & df.D.eq(2)))

In [175]: df
Out[175]:
                        A     B    C    D
Index
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN
或使用assign
NaN

df = a.mask((a['A'] == 9) & (a['D'] == 2))
print (df)
                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN
计时

a[(a['A'] == 9) & (a['D'] == 2)] = np.nan
print (a)
                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN


选项1
这与@Jezrael的
mask
解决方案相反

#jez2
In [256]: %timeit a[(a['A'] == 9) & (a['D'] == 2)] = np.nan
10 loops, best of 3: 25.8 ms per loop

#jez2upr
In [257]: %timeit a.loc[(a['A'] == 9) & (a['D'] == 2)] = np.nan
10 loops, best of 3: 27.6 ms per loop

#Wen
In [258]: %timeit a.mul(np.where((a.A==9)&(a.D==2),np.nan,1),0)
10 loops, best of 3: 90.5 ms per loop

#jez1
In [259]: %timeit a.mask((a['A'] == 9) & (a['D'] == 2))
1 loop, best of 3: 316 ms per loop

#maxu2
In [260]: %timeit a.where(~(a.A.eq(9) & a.D.eq(2)))
1 loop, best of 3: 318 ms per loop

#pir1
In [261]: %timeit a.where(a.A.ne(9) | a.D.ne(2))
1 loop, best of 3: 316 ms per loop

#pir2
In [263]: %timeit a[a.A.ne(9) | a.D.ne(2)].reindex(a.index)
1 loop, best of 3: 355 ms per loop

选项2
pd.DataFrame.reindex

a.where(a.A.ne(9) | a.D.ne(2))

                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN

或者您可以尝试在
np.where

a[a.A.ne(9) | a.D.ne(2)].reindex(a.index)

                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN

这很聪明(:是的,的确,这是一个聪明的选择!我们可以用它做一行:
df.mul(np.where((df.a==9)和(df.D==2),np.nan,1))
@MaxU谢谢,是的,你在线更整洁~I get
ValueError:无法使用长度与值不同的列表索引器设置第一个解决方案:(@jezrael,你能提供一个样本数据集来重现这个错误吗?@jezrael,我无法重现it@jezrael,pandas:0.20.1Hmmm,好的。更改答案后,我可以将您的解决方案添加到计时中。谢谢。
#jez2
In [256]: %timeit a[(a['A'] == 9) & (a['D'] == 2)] = np.nan
10 loops, best of 3: 25.8 ms per loop

#jez2upr
In [257]: %timeit a.loc[(a['A'] == 9) & (a['D'] == 2)] = np.nan
10 loops, best of 3: 27.6 ms per loop

#Wen
In [258]: %timeit a.mul(np.where((a.A==9)&(a.D==2),np.nan,1),0)
10 loops, best of 3: 90.5 ms per loop

#jez1
In [259]: %timeit a.mask((a['A'] == 9) & (a['D'] == 2))
1 loop, best of 3: 316 ms per loop

#maxu2
In [260]: %timeit a.where(~(a.A.eq(9) & a.D.eq(2)))
1 loop, best of 3: 318 ms per loop

#pir1
In [261]: %timeit a.where(a.A.ne(9) | a.D.ne(2))
1 loop, best of 3: 316 ms per loop

#pir2
In [263]: %timeit a[a.A.ne(9) | a.D.ne(2)].reindex(a.index)
1 loop, best of 3: 355 ms per loop
a.where(a.A.ne(9) | a.D.ne(2))

                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN
a[a.A.ne(9) | a.D.ne(2)].reindex(a.index)

                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN
a=np.where((df2.A==9)&(df2.D==2),np.nan,1)
df2.mul(a,0)
#one line df.mul(np.where((df.A==9)&(df.D==2),np.nan,1))

                        A     B    C    D
Index                                    
2016-07-20 18:00:00   NaN   NaN  NaN  NaN
2016-07-20 19:00:00   9.0  2.64  0.0  3.0
2016-07-20 20:00:00  12.0  2.59  0.0  1.0
2016-07-20 21:00:00   NaN   NaN  NaN  NaN