【问题标题】:How to detect sign change of values of a column of a pandas dataframe using numpy or pandas?如何使用numpy或pandas检测pandas数据框列值的符号变化?
【发布时间】:2022-10-03 02:50:46
【问题描述】:

我想使用 pandas 或 numpy 检测我的数据的符号变化。我想计算id 的数量,它在两个立即的TIMESTEP 值之间改变y 的符号(例如,对于 2800 和 2900 TIMESTEP,id 313 已更改符号(y 变为负数) .我通过计算负数然后使用删除重复尝试了下面的代码,但这又不是有效和正确的。

df_negatives0 = df0.query(\'y < 0\')
df_nonduplicate0=df_negatives0.drop_duplicates(subset=[\"id\"])

我的数据集:

TIMESTEP    id  mass    y
0       42  0.755047    0.489375
0       245 0.723805    0.479446
0       344 0.675664    0.463363
...
...
2800    313 0.795699    0.00492984
2800    425 0.68311     0.282356
2900    42  0.755047    0.424421
2900    245 0.723805    0.0378489
2900    344 0.675664    0.127917
2900    313 0.795699    -0.0149792
2900    425 0.68311     0.273884
...
...
upto
10000000

我想要的数据:

TIMESTEP    id_count    mass
2900        1           0.795699
...
...
500000      2           0.85245 + 0.54852 (i want to sum the masses if id count is more than one)
...
...
upto
10000000

    标签: python pandas dataframe numpy


    【解决方案1】:
    • 对于每个 id,找到符号改变的行
    • 为每个 TIMESTEP 进行聚合
    def filter_sign_changed(df_same_id):
        df_same_id = df_same_id.sort_values(by="TIMESTEP")
        sign_changed = df_same_id.y * df_same_id.y.shift(1) < 0
        return df_same_id[sign_changed]
    
    sign_changed_df = df.groupby("id").apply(filter_sign_changed)
    result = sign_changed_df.groupby("TIMESTEP", as_index=False).agg(id_count=("id", "size"), mass=("mass", "sum"))
    result
    

    【讨论】:

    • 是的,它解决了我的问题。时间
    【解决方案2】:

    numpy np.sign 中有一个专用函数(感谢 @Asclepius 在此答案的先前版本中标记错误)并且对于从一行到下一行的符号更改,可以使用 .diff 方法:

    from numpy import sign
    from pandas import DataFrame
    
    df = DataFrame([-2, 0, -1, 3, -2], columns=["x"])
    
    # this will return the sign of the float x
    df["sign"] = sign(df["x"])
    
    # this will return the difference between the sign of two consecutive rows
    print(df["sign"].diff())
    # 0    NaN
    # 1    1.0
    # 2   -1.0
    # 3    2.0
    # 4   -2.0
    

    【讨论】:

    • 我会以这种方式尝试我的数据。
    • 这个答案是错误的。 Pandas 中没有.sign()
    • @Asclepius:感谢您指出这一点,我现在正在调查,并将很快更新答案!
    • @Asclepius:谢谢,我现在修好了……不知道为什么我认为有 .sign 方法。 :/
    猜你喜欢
    • 2020-10-10
    • 2014-05-18
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2018-12-03
    • 2017-10-05
    相关资源
    最近更新 更多