【问题标题】:Is there a way to return float or integer from a conditional True/False有没有办法从条件 True/False 返回浮点数或整数
【发布时间】:2022-01-06 00:55:23
【问题描述】:
n_level = range(1, steps + 2)

steps 是用户输入,使用多索引数据框

    df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707]}


    for i in n_level:
        if df['Crest'] >= df[f'L{i}T']:
            df['Marker'] = i
        elif df['Trough'] <= df[f'L{i}M']:
            df['Marker'] = -i
        else:
            df['Marker'] = 0

我期待带有 col 标记的 df 下方

    df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707], 'Marker': [0, -2, 1, 3]}, 

if 语句返回 True 或 False,使用它我们可以将其转换为第 i 个值 (+/-)

我需要的是另一个 col df['Marker'],它将测量波峰或波谷是否越过 L{i}T 或 L{i}M,在波峰和突破的情况下,任何上行突破低谷时的不利影响

【问题讨论】:

  • 您好,请提供minimal reproducible example。如果没有样本可重复的输入和预期的输出,很难理解和帮助您。
  • 请将您的部分数据作为字典包含在内,图像很难处理。
  • 您的df 是字典,而不是数据框。我在代码中没有看到任何 pandas 对象

标签: pandas data-science python-3.7 physics


【解决方案1】:

这可以很容易地使用二分搜索来实现,有很多方法可以应用它(NumPy,二分法)。 我会推荐图书馆 bisect。

为波峰添加了 Buu,为波谷添加了 See,以便对细分进行编码和区分。你可以选择任何东西

def marker_up(row):
    n_row = [row[col] for col in columns if "Buu" in col]
    n_high = row['Crest']
    if n_high in n_row:
        q = bs.bisect_left(n_row, n_high)
        q = max(0, q)
        return q
    else:
        q_mod = bs.bisect_left(n_row, n_high)
        q_mod -= 1
        q_mod = max(0, q_mod)
        return q_mod

Marker_up = df.apply(marker_up, axis=1)

def marker_down(row):
    n_row = [row[col] for col in columns if "See" in col]
    n_low = row['Trough']
    if n_low in n_row:
        q = bs.bisect_left(n_row, n_low)
        q = q - len(n_row)
        return q
    else:
        q_mod = bs.bisect_left(n_row, n_low)
        q_mod = q_mod - len(n_row)
        return q_mod

Marker_down = df.apply(marker_down, axis=1)
df['Marker'] = Marker_up + Marker_down

return df

如果您的 df 很大,请不要使用 iloc、dict 或 iterrrows。矢量化形式将有助于更快地运行代码。

【讨论】:

  • 你必须将 bisect 导入为 bs
  • 工作得很好,谢谢
【解决方案2】:

你能用 Numpy 搜索排序吗 该列表应该是该行的值数组。

df['Marker'] = np.searchsorted(df['Crest'], list)

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多