簡體   English   中英

Python Pandas - 根據值刪除行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM