【问题标题】:Python: Expand one row into multiple rows and make calculationsPython:将一行展开为多行并进行计算
【发布时间】:2021-04-20 19:14:01
【问题描述】:

我有这两个观察结果:

    Date    Confirmed Cases
0   2020-12-27  100
1   2020-12-28  1000

在这个数据框中,我想制作这个表格:

    Date    Confirmed Cases
0   2020-12-27  100
1   2020-12-27  280
2   2020-12-27  460
3   2020-12-27  640
4   2020-12-27  820
5   2020-12-28  1000

基本上,我想将我的两行扩展为六行,其他四行的值将相等地上升到第六行的值。

因此,如果我的第一行包含 100 个值,第二行包含 1000 个值,并且我想添加 4 个新行,那么每行的相等部分将是:(1000 - 100) / (4 + 1)

这是数据:

pd.DataFrame({"Date": ['2020-12-27', '2020-12-28'],
             "Confirmed Cases": [100, 1000]})

【问题讨论】:

  • 如何确定必须添加多少行?总是 4?
  • 是否总是有两行,或者您是否还有更多需要填写?
  • 总是固定的行数。此外,可以有两行以上。
  • 天数不连续怎么办?

标签: python pandas


【解决方案1】:

这是基于此enumerate/unstack/stack 方法的另一个选项,可处理任意日期:

rows = 4
(df.assign(enum=df.groupby('Date').cumcount())
   .set_index(['enum', 'Date'])
   .unstack('Date')
   .reindex(range(rows + 1))
   .stack('Date', dropna=False)
   .sort_index(level='Date')
   .reset_index('Date')
   .interpolate()
   .reset_index(drop=True)
).iloc[:-rows]

输入:

         Date  Confirmed Cases
0  2020-12-27              100
1  2020-12-28             1000
2  2020-12-29             5000

输出:

         Date  Confirmed Cases
0  2020-12-27            100.0
1  2020-12-27            280.0
2  2020-12-27            460.0
3  2020-12-27            640.0
4  2020-12-27            820.0
5  2020-12-28           1000.0
6  2020-12-28           1800.0
7  2020-12-28           2600.0
8  2020-12-28           3400.0
9  2020-12-28           4200.0
10 2020-12-29           5000.0

【讨论】:

    【解决方案2】:

    使用-

    rows=4
    df1 = pd.concat([df.iloc[0:1], pd.DataFrame([[np.nan]*df.shape[1]]*rows, columns=df.columns), df.iloc[-1:]], ignore_index=True)
    df1['Confirmed_Cases'] = df1['Confirmed_Cases'].interpolate()
    df1['Date'] = df1['Date'].ffill()
    

    输出

             Date  Confirmed_Cases
    0  2020-12-27            100.0
    1  2020-12-27            280.0
    2  2020-12-27            460.0
    3  2020-12-27            640.0
    4  2020-12-27            820.0
    5  2020-12-28           1000.0
    

    为此,您需要import numpy as np

    【讨论】:

    • 如果我想将它用于两行以上怎么办?我可以循环它,但有没有更有效的方法?
    • 如果您的行数超过两行,您可以根据行的索引进行连接。
    • 例如,如果要在索引 1 处的任意行数的表中插入 4 行:df = pd.concat([df.iloc[0:1], pd.DataFrame([[np.nan]*df.shape[1]]*rows, columns=df.columns), df.iloc[1:]], ignore_index=True),然后是 df['Confirmed Cases'] = df['Confirmed Cases'].interpolate(),然后是 df['Date'] = df['Date'].ffill()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多