[英]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: id
, value
和可能更多。 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.