python - 识别数据框中不断增加的特征
问题描述
我有一个数据框,它显示了一些具有累积值的特征。我需要识别这些特征以恢复累积值。这是我的数据集的外观(加上大约 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
*(术语累积并不真正代表您使用的条件。您希望它是累积的还是只是增加?累积意味着特定行/索引中的值是该索引之前所有先前值的总和,同时增加就是这样,当前行/索引中的值大于以前的值。)
推荐阅读
- firebase - Flutter:Future builder 不获取数据
- excel - 平均月报表 Excel
- java - 删除视图之间的额外空间
- .net-core - .Net core 2.2 API 版本控制和正确路由
- pega - 如何以 pega,YY-mm-dd 格式获取当前日期
- java - 使用 aws lambda java 检查用户是否存在于组中
- linux - 返回符号链接时 ../../ 是什么意思?
- serialization - Xamarin Forms - 序列化/反序列化不起作用
- binary - 当两个变量进行逻辑比较时,检验等价的逻辑门是?使用逻辑门
- azure - 如果超时超过 10 分钟,Python Azure Functions 会发出警报