【问题标题】:Count values row-wisely based on multiple interval conditions in Python根据 Python 中的多个间隔条件逐行计算值
【发布时间】:2021-12-19 08:43:11
【问题描述】:

给定一个数据框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}])

输出:

        date      pct1      pct2      pct3      pct4      pct5
0  2021-10-1 -0.039474 -0.039474 -0.032095 -0.106311 -0.039474
1  2021-10-2  0.222111  0.042484  0.108269 -0.050189  0.042484
2  2021-10-3 -0.013172  0.051357  0.051357  0.130772  0.051357
3  2021-10-4  0.092983  0.092983  0.092983  0.147102  0.092983

我希望根据以下逻辑逐行计算值的数量:

  1. 如果值在-0.02 ≤ x ≤ 0.02的区间内,则计数到 keep_same专栏;
  2. 如果值在x < -0.02的区间内,则计数到decrease 列;
  3. 如果值在x > 0.02的区间内,则计数到increase 列;

预期结果如下:

        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

我的想法如下,第一步根据上述条件将df的值替换为0、-1和1,然后逐行计算:

pct_df = df.filter(regex='^pct')

conds = [pct_df.values > 0.02, -0.02 <= pct_df.values <= 0.02, pct_df.values < -0.02]
choices = [1, 0, -1]

pd.DataFrame(np.select(conds, choices, default=np.NaN),
             index=pct_df.index,
             columns=pct_df.columns)

我怎么能做到这一点?谢谢。

【问题讨论】:

    标签: python-3.x pandas dataframe numpy


    【解决方案1】:

    对于条件,必须通过&amp; 在值之间将其链接起来,然后定义新的列名称并在循环中由sum 分配计数,因为新的DataFrame 仅在date 列上过滤:

    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]
    cols = ['decrease', 'keep_same', 'increase']
    
    df1 = df[['date']].copy()
    for c, m in zip(cols, conds):
        df1[c] = m.sum(axis=1)
    print (df1)
            date  decrease  keep_same  increase
    0  2021-10-1         0          0         5
    1  2021-10-2         4          0         1
    2  2021-10-3         4          1         0
    3  2021-10-4         5          0         0
    

    【讨论】:

    • 非常感谢,题外话,但我怎么能给你买杯咖啡来表示我的感谢呢? ;)
    • @ahbon - 这可能很奇怪,但我不喝咖啡;)谢谢。
    • 可能是这样的链接:buymeacoffee.com,你已经帮助了很多次了。
    • @ahbon - 最简单,使用df1 = pd.DataFrame(index=df.index)
    • @ahbon - 我可以测试这个链接,但稍后。
    【解决方案2】:

    如果您对这些一一分配没有问题,您可以简单地使用

    df['decrease'] = (pct_df.values < -0.02).sum(axis=1)
    df['keep_same'] = (-0.02 <= pct_df.values <= 0.02).sum(axis=1)
    df['increase'] = (pct_df.values > 0.02).sum(axis=1)
    

    您已经创建了布尔值。对轴 1 求和使您的逐行计算完成。

    【讨论】:

    • 对不起,我用我的真实数据测试你的代码,它会引发错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    • 你一定做错了什么。情况不应该如此。我们没有将数组用作 if 条件。你确定完全一样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2020-03-26
    • 2019-06-10
    相关资源
    最近更新 更多