簡體   English   中英

Pandas DataFrame - 如何刪除包含特定列的 null 值的整個類別

[英]Pandas DataFrame - how to drop the entire category containing null values for specific columns

假設我有以下 DataFrame:

words_per_page 人物
第一冊 1 27
第一冊 2 30
第一冊 2 30 25
書 2 1 30 26
書 2 2 28 30

如何刪除包含至少一個 null 值的書籍,其中每頁Words Per PageCharacters數? 在上述情況下,我想刪除與 Book 1 關聯的所有條目。

這是這兩個問題的結合,但我還沒有搞定。

pandas 如果任何特定列包含特定值,如何刪除整行?

如果特定列包含 null 值,如何從 dataframe 中刪除行?

應該是直接在dataframe上做的方法。 我有很多數據,我需要盡可能高效地運行,我試圖避免 dataframe 之外的if語句。

感謝大家!

您可以找到將這兩個值中的任何一個作為 NaN 的行,然后使用~運算符從您的 df 中排除這些行

import pandas as pd
import numpy as np
df = pd.DataFrame({'book': ['Book 1', 'Book 1', 'Book 1', 'Book 2', 'Book 2'],
 'page': [1, 2, 2, 1, 2],
 'words_per_page': ['27', np.nan, '30', '30', '28'],
 'characters': [np.nan, '30', '25', '26', '30']})

books_with_nulls = df.loc[df[['words_per_page','characters']].isnull().any(axis=1)]['book'].unique()
df.loc[~df['book'].isin(books_with_nulls)]

您可以groupbyfilter刪除未通過過濾器的整個組/書籍。 這里的過濾器是每個書組在notnullcharactersall值中都必須不為Words_per_page

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'book': ['Book 1', 'Book 1', 'Book 1', 'Book 2', 'Book 2'],
    'page': [1, 2, 2, 1, 2],
    'words_per_page': [27, np.nan, 30, 30, 28],
    'characters': [np.nan, 30, 25, 26, 30]
})

filt_df = (
    df.groupby('book').filter(
        lambda b: b['words_per_page'].notnull().all() and b['characters'].notnull().all() 
    )
)

filt_df

groupby.filter在大型數據集上的速度非常慢,不確定它是否足以滿足您的用例

識別與該標准匹配的書籍 ID,並使用這些書籍 ID 過濾 DF,例如

import pandas as pd

data = [
    [1, 1, 27, None],
    [1, 2, None, 30],
    [1, 2, 30, 25],
    [2, 1, 30, 26],
    [2, 2, 28, 30]
]

columns = [
    'book_id',
    'page_number',
    'words_per_page',
    'character_count'
]

df = pd.DataFrame(data, columns=columns)
df = df[~df.book_id.isin(
    df[
        (df.words_per_page.isna()) |
        (df.character_count.isna())
    ].book_id
)].copy()
   book_id  page_number words_per_page  character_count
3  2        1           30.0            26.0
4  2        2           28.0            30.0

這是一種方法

df.dropna(axis=0, how='any')

或者如果只檢查 null 值的列子集

df.dropna(subset=['words_per_page','characters'], axis=0, how='any')

    book    page    words_per_page  characters
2   Book 1    2                 30          25
3   Book 2    1                 30          26
4   Book 2    2                 28          30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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