[英]Python Pandas - Drop row based on value
我有一個帶有A列和B列的Pandas數據幀
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))
我創建了列C,如果A > B
則為NULL
df['C'] = np.select([ df.A > df.B ], [df.A], default=np.NaN)
這給了:
A B C
0 95 19 95.0
1 46 11 46.0
2 96 86 96.0
3 22 61 NaN
4 69 1 69.0
5 78 91 NaN
6 42 7 42.0
7 24 28 NaN
8 55 92 NaN
9 92 16 92.0
然后,我使用以下幾種方法之一刪除具有df.C作為NaN的行:
df = df.dropna(subset=['C'], how='any')
要么
df = df.drop(df[pd.isnull(df.C)].index)
要么
df = df.drop(df[(pd.isnull(df.C))].index)
並且所有3種方法都讓我大致有行。 在這種情況下:
A B C
0 95 19 95.0
1 46 11 46.0
2 96 86 96.0
4 69 1 69.0
6 42 7 42.0
9 92 16 92.0
但是當我不使用數字時,例如一個字符串:
df['C'] = np.select([ df.A > df.B ], ['yes'], default=np.NaN)
然后,不過濾那些用df.C作為NaN的行刪除相同的3種方法。 例如,當df.A > df.B
將列C設置為yes
,我會得到這樣的結果:
A B C
0 6 70 nan
1 85 46 yes
2 76 87 nan
3 77 36 yes
4 73 18 yes
5 1 41 nan
6 19 69 nan
7 62 89 nan
8 6 7 nan
9 35 75 nan
我可以解決這個問題,將pd.NaN替換為'IGNORE'之類的字符串,然后過濾'IGNORE',但我發現這個結果是出乎意料的。
df['C'] = np.select([ df.A > df.B ], ['yes'], default='IGNORE')
df = df.drop(df[(df.C == 'IGNORE')].index)
這里發生了什么? (當df.C是一個字符串時,我的pd.NaN是否被轉換為字符串?)
我在Windows 10上使用64位Python 2.7.13,Pandas 0.19.2和Numpy 1.11.3。
而不是丟棄,只取有限值。
df = df[np.isfinite(df['C'])]
編輯:
根據你的評論, nan
是類型string
,因此,根據值刪除行:
df = df[df.C != "nan"]
將起作用
df[df.C.notnull()]
A B C
0 67 23 yes
1 91 61 yes
2 30 92 nan
3 53 97 nan
4 81 11 yes
5 23 7 yes
6 47 39 yes
7 11 27 nan
8 46 55 nan
9 31 82 nan
df = df[df.C != "nan"]
A B C
0 67 23 yes
1 91 61 yes
4 81 11 yes
5 23 7 yes
6 47 39 yes
你的情況類似於這個:
np.array([1,2,'3',np.nan])
# array(['1', '2', '3', 'nan'],
# dtype='<U21')
因為如果你進一步檢查, np.select
也會返回一個數組
type(np.nan)
# float
str(np.nan)
# 'nan'
所以np.nan
是一個浮點數,但是numpy數組更喜歡單個數據類型,除了結構化數組 ,所以當數組中有一個字符串元素時,所有元素都轉換為字符串。
對於您的情況,如果您有字符串列,則可以使用None
代替np.nan
作為默認值,這將創建一個缺失值,可以通過isnull()
檢查並使用dropna()
:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))
df['C'] = np.select([ df.A > df.B ], ['yes'], default=None)
df.dropna()
# A B C
#0 82 1 yes
#3 84 8 yes
#6 52 30 yes
#7 68 61 yes
#9 91 87 yes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.