我有一个数据框架,该框架展示了一些具有累积值的特征。我需要识别这些功能以便还原累积值。 这是我的数据集的外观(加上大约50个变量):
clients
我希望实现的是:
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
然后,我将这些要素名称手动保存在一个名为cum_features的列表中,并还原这些值,以创建所需的数据集:
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)
有没有更好的方法来解决我的问题?
答案 0 :(得分: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
*(“累计”一词并不能真正代表您所使用的条件。您希望它是累计的还是只是在增加?累积表示特定行/索引中的值是该索引之前所有先前值的总和,虽然只是增加而已,但当前行/索引中的值却比以前大。)