【问题标题】:How to access previous row to update the current row in python dataframe?如何访问上一行以更新python数据框中的当前行?
【发布时间】:2022-01-25 02:57:27
【问题描述】:

我正在尝试使用入院和出院来计算医院人口普查(某一天在医院的患者人数)。人口普查 = 前一天的人口普查 + 入院人数 - 出院人数。

这是我写的代码:

# Calculate census
df['ICU census'] = 0
df['ICU census lag'] = df['ICU census'].shift(1)

df['ICU census'] = df['ICU census lag'] + df['ICU admissions'] - df['ICU discharges']

问题在于,从某种意义上说,人口普查的滞后在人口普查发生变化时不会更新,这不是动态的。有没有办法在没有循环的情况下做到这一点?

谢谢

【问题讨论】:

  • 您能举个例子吗?最好是样本dataframe 和您期望的结果。

标签: python dataframe


【解决方案1】:

如果我对您的理解正确,您希望更改一列会更改 Pandas DataFrame 中的另一列。如果是这种情况,那么您必须像这样重载 pandas DataFrame 的方括号运算符 []

import pandas as pd


class MyDataFrame(pd.DataFrame):
    def __init__(self, data, columns=None):
        super().__init__(data=data, columns=columns)

    def __setitem__(self, key, value):
        if key == 'ICU census':
            ret = super().__setitem__(key, value)
            super().__setitem__('ICU census lag', self['ICU census'].shift(1))
            return ret
        else:
            return super().__setitem__(key, value)

现在您可以像这样初始化 DataFrame:

df = MyDataFrame(data=[[1,2,3],[4,5,6],[7,8,9]], columns=['ICU census','ICU census lag','ICU admissions'])

打印出来:

print(df)
   ICU census  ICU census lag  ICU admissions
0           1               2               3
1           4               5               6
2           7               8               9

修改ICU census并打印:

df['ICU census'] += 1
print(df)
   ICU census  ICU census lag  ICU admissions
0           2             NaN               3
1           5             2.0               6
2           8             5.0               9

请注意,ICU censusICU census lag 列都已修改。

【讨论】:

  • 您好,非常感谢您。它并不能完全满足我的需要,但它确实允许我手动更新列。我会将此代码用于其他目的:)
  • @IgorZverev - 如果您能进一步阐明您的实际需求(也许提供一个例子),那将是有益的
【解决方案2】:

使用 pandas 的主要目的是操作、探索和分析数据,因此跟踪和更新数据不是您的最佳选择,我建议使用关系数据库(postgres) 然后“如果需要”将您的数据导出到 csv 文件以供 pandas 分析

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2016-06-21
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多