Python实现pandas DataFrame按多区间条件逐行统计数值数量
实现方案
你现有的思路是可行的,只需要修正条件写法,再补充按行统计计数、拼接date列的逻辑即可。下面给出两种实现方式:
方法1:沿你原有替换逻辑实现
你代码里的小问题:numpy数组不支持链式比较-0.02 <= pct_df.values <= 0.02,需要拆成两个判断条件用&连接。完整代码如下:
import pandas as pd import numpy as np # 你原有的df定义 df = pd.DataFrame([{'date': '2021-10-1', 'pct1': -0.039473959, 'pct2': -0.039473959, 'pct3': -0.032095057, 'pct4': -0.106310578, 'pct5': -0.039473959}, {'date': '2021-10-2', 'pct1': 0.222111128, 'pct2': 0.042484279, 'pct3': 0.108269001, 'pct4': -0.050188884, 'pct5': 0.042484279}, {'date': '2021-10-3', 'pct1': -0.0131719, 'pct2': 0.051357438, 'pct3': 0.051357438, 'pct4': 0.130772264, 'pct5': 0.051357438}, {'date': '2021-10-4', 'pct1': 0.092982799, 'pct2': 0.092982799, 'pct3': 0.092982799, 'pct4': 0.147102302, 'pct5': 0.092982799}]) pct_df = df.filter(regex='^pct') # 修正条件写法 conds = [ pct_df.values > 0.02, (pct_df.values >= -0.02) & (pct_df.values <= 0.02), pct_df.values < -0.02 ] choices = [1, 0, -1] # 替换得到映射后的df map_df = pd.DataFrame(np.select(conds, choices, default=np.NaN), index=pct_df.index, columns=pct_df.columns) # 逐行统计各值的数量 res = pd.DataFrame({ 'date': df['date'], 'decrease': (map_df == -1).sum(axis=1), 'keep_same': (map_df == 0).sum(axis=1), 'increase': (map_df == 1).sum(axis=1) }) print(res)
方法2:更简洁的直接统计方案
不需要提前做值替换,直接对所有pct列按行统计满足条件的数量即可,代码更短性能也更高:
import pandas as pd # 你的df定义同上 pct_df = df.filter(regex='^pct') res = pd.DataFrame({ 'date': df['date'], 'decrease': (pct_df < -0.02).sum(axis=1), 'keep_same': ((pct_df >= -0.02) & (pct_df <= 0.02)).sum(axis=1), 'increase': (pct_df > 0.02).sum(axis=1) }) print(res)
两种方法运行后都会得到你需要的预期输出:
date decrease keep_same increase 0 2021-10-1 5 0 0 1 2021-10-2 1 0 4 2 2021-10-3 0 1 4 3 2021-10-4 0 0 5
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

