簡體   English   中英

通過在給定列中選擇不包含NaN的第一行來過濾DataFrame(如果不存在,則選擇任一行)

[英]Filter DataFrame by selecting the first row with not-NaN in the given column (or any one row if doesn't exist)

我有一個(至少)兩列的pandas dataframe df: idvalue和可能更多。 id不是唯一的。 我需要過濾數據框,以便每個id僅保留一行。 我要選擇的行是值不是NaN的行。 保證最多有一個這樣的行。 對於那些在值列中具有所有NaN的ID,我不在乎選擇哪一行。 實現此目標的最佳方法是什么?

示例:如果數據框為

id  other   value
0   0   3.14
0   1   NaN
1   2   NaN
1   3   NaN

結果可能是

id  other   value
0   0   3.14
1   2   NaN

要么

id  other   value
0   0   3.14
1   3   NaN

假設您的數據幀名為dff ,則應執行以下操作:

f = lambda x: x.head(1) if x.value.isnull().all() else x[~x.value.isnull()].head(1)

dff.groupby('id').apply(f)

輸出:

#       id  other  value
# id                    
# 0  0   0      0   3.14
# 1  2   1      2    NaN

它首先按id列對數據框進行分組。 如果value列中的所有元素都為null ,則它將占據第一行。 否則,它將濾除null值並獲取輸出的第一行。

我希望這有幫助。

您可以sort_values ,有一個參數na_position ,默認為'last',這意味着它將把該列的所有NaN推到底部。 因此,您可以使用以下命令為每個“ id”獲取一條記錄。

df.sort_values(by='value').groupby('id').head(1)

輸出:

   id  other  value
0   0      0   3.14
2   1      2    NaN

定時:

Abdou解決方案:

f = lambda x:如果x.value.isnull()。all()否則為x [〜x.value.isnull()]。head(1)的x.head(1)

df.groupby( 'ID')。適用(F)

100次循環,每循環3:5.62毫秒最佳

這個解決方案

df.sort_values(由= '值')。GROUPBY( 'ID')。頭(1)

1000次循環,每循環3:1.44毫秒最佳

暫無
暫無

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

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