[英]Identify increasing features in a data frame
我有一個數據框架,該框架顯示具有累積值的某些功能。 我需要識別這些功能以便還原累積值。 這是我的數據集的外觀(加上大約50個變量):
a b
346 17
76 52
459 70
680 96
679 167
246 180
我希望實現的是:
a b
346 17
76 35
459 18
680 26
679 71
246 13
我似乎是這個答案,但它首先還原值,然后嘗試識別列。 我不能反過來嗎? 首先確定功能,然后還原值?
我現在正在運行以下代碼,以便為我提供具有累積值的功能名稱:
def accmulate_col(value):
count = 0
count_1 = False
name = []
for i in range(len(value)-1):
if value[i+1]-value[i] >= 0:
count += 1
if value[i+1]-value[i] > 0:
count_1 = True
name.append(1) if count == len(value)-1 and count_1 else name.append(0)
return name
df.apply(accmulate_col)
之后,我將這些功能名稱手動保存在一個名為cum_features的列表中,並還原這些值,以創建所需的數據集:
df_clean = df.copy()
df_clean[cum_cols] = df_clean[cum_features].apply(lambda col: np.diff(col, prepend=0))
有沒有更好的方法來解決我的問題?
為了確定在整個列中哪些列的值具有遞增*,您將需要對所有值應用條件。 因此,從這種意義上講,您必須首先使用值來確定哪些列符合條件。
有了這種方式,給定一個數據框,例如:
import pandas as pd
d = {'a': [1,2,3,4],
'b': [4,3,2,1]
}
df = pd.DataFrame(d)
#Output:
a b
0 1 4
1 2 3
2 3 2
3 4 1
弄清楚哪些列包含遞增的值只是在數據幀中的所有值上使用diff並檢查整個列中哪些遞增的問題。
可以寫成:
out = (df.diff().dropna()>0).all()
#Output:
a True
b False
dtype: bool
然后,您可以僅使用列名選擇其中包含True
那些列。
new_df = df[df.columns[out]]
#Output:
a
0 1
1 2
2 3
3 4
*(術語“累計”並不真正代表您所使用的條件。您希望它是累計的還是只是增加?累積表示特定行/索引中的值是該索引之前所有先前值的總和,同時增加僅僅是,當前行/索引中的值大於先前的值。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.