[英]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.apply
與max(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.