【问题标题】:I want to check if row value equals column name and change the values of the row that come after the intersecting value我想检查行值是否等于列名并更改相交值之后的行值
【发布时间】:2022-11-19 06:10:52
【问题描述】:

我有一个时间序列数据,转换为数据帧。我有多个列,其中第一列是时间戳,其余列名是时间戳,价格作为值。

示例数据框:

这个想法是遍历行并检查“日期”列中的行值是否与任何列名称匹配(以蓝色突出显示),如果匹配,则交集处的值(以黄色突出显示)应该保留并且所有值之后(以灰色突出显示)应替换为空值或 0。

例如:第一列“2022-01-02 00:00:00+01:00”中的值与同名列“2022-01-02 00:00:00+01:00”匹配。因此,相交值即“80.82”应该保留,该行中的其余值(以灰色突出显示)应该替换为空值或 0。

我尝试了以下操作,但这取代了相交值。

for i in df.columns:
     df.loc[df['date']==i,i]=None

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    “这个想法是遍历行和检查“日期”列中的行值是否与任何列名匹配df['date'] == column,如果确实如此,那么交叉点的值应该保留并且它之后的所有值df.columns[(idx+1):] 应替换为 null 或 0's 。”

    for idx, column in enumerate(df.columns):
        df.loc[df['date'] == column, df.columns[(idx+1):]]=None
    

    enumerate() function 向可迭代对象添加了一个计数器。

    解释:

    df.columns = ["date", "2022-01-01 23:55:00+01:00", "2022-01-02 00:00:00+01:00", "2022-01-02 00:05:00+01:00", ...]
    
    list(enumerate(df.columns))
    
    # return
    [(0, "date"), (1, "2022-01-01 23:55:00+01:00"), (2, "2022-01-02 00:00:00+01:00"), (3, "2022-01-02 00:05:00+01:00"), ...]
    

    在 for 循环中,第一次 (0, "date") 和第二次迭代 (1, "2022-01-01 23:55:00+01:00") 与任何行都不匹配。第三次迭代与第一行匹配。以此为例

    idx, column = 2, "2022-01-02 00:00:00+01:00"
    

    df['date'] == column 返回布尔值列表 [True, False, False, False, ...]

    df.columns[(idx+1):]df.columns[3:],它返回"2022-01-02 00:00:00+01:00"之后的列名列表,即["2022-01-02 00:05:00+01:00", "2022-01-02 00:10:00+01:00", ...]

    df.loc[df['date'] == column, df.columns[(idx+1):]]=None
    

    相当于

    df.loc[[True, False, False, ...], ["2022-01-02 00:05:00+01:00", "2022-01-02 00:10:00+01:00", ...]]=None
    

    它将第一行和"2022-01-02 00:00:00+01:00"之后的列填充为None

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2021-07-16
      • 2010-11-10
      • 2018-05-13
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多