簡體   English   中英

根據列之間的差異過濾 Dataframe [不是下一個到下一個列]

[英]Filter Dataframe Based on Differnce Between Columns [Not Next-to-Next Columns]

我有一個獨特的 dataframe, df

name         val_1       val_2      val_3     val_4

AAA            1          2           3         11       
BBB            2          3           5         9
CCC            6          4           15        10

我只需要保留任何右側val列從之前的任何val列增加 10 的名稱,否則刪除它們。

我知道diff()ge()在這里會有所幫助,但不確定如果差異不是關於下一個列之間的差異,它們將如何工作。

所需的 output:

name

AAA #val_4 increases by 10 from val_1  
CCC #val_3 increases by 11 from val_2 

最聰明的做法是什么? 任何建議,將不勝感激。 謝謝!

我敢肯定,您不需要先創建列然后過濾數據(但我目前不知道如何),但我猜df.applymax(x) - min(x)是 go 的好方法。

df = pd.DataFrame(
    {
        'name' : ['AAA', 'BBB', 'CCC'],
        'val_1' : [1,2,6],
        'val_2' : [2,3,4],
        'val_3' : [3,5,15],
        'val_4' : [11,9,10]
    }
)

df.set_index('name', drop=True, inplace=True)
df['rows_to_keep'] = df.apply(lambda x: x[-1] - x[0], axis=1)
df = df[df['rows_to_keep'] >= 10]

像這樣的東西會將任何數字放在每行最大數量的右側,然后取最小值/最大值之間的差異並查找 > 10 的行

df.loc[df.iloc[:,1:].apply(lambda x: x[0:x.idxmax()+1]).max(1) - df.iloc[:,1:].apply(lambda x: x[0:x.idxmax()+1]).min(1) >= 10].name.tolist()

Output

['AAA','CCC']

丑陋,但我認為它正在做需要做的事情。 請注意,我將 val_1 的第二個值更改為 20,以便我們可以確保我們不會從左到右,而不僅僅是從右到左。

import pandas as pd

df = pd.DataFrame(
    {
        'name': ['AAA', 'BBB', 'CCC'],
        'val_1': [1, 20, 6],
        'val_2': [2, 3, 4],
        'val_3': [3, 5, 15],
        'val_4': [11, 9, 10]
    }
)

df = df.set_index("name")

f = lambda x: [x[1]-x[0], 0][len(x)>2] or \
    max( *[ x[-1] - x[i] for i in range(0, len(x)-1)] , *(f(x[:-1]),) )

df = df[df.apply(f, axis=1) >= 10]

print(df.index.to_list())

暫無
暫無

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

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