【问题标题】:Compare Relative Start Dates in Pandas比较 Pandas 中的相对开始日期
【发布时间】:2020-02-25 00:05:42
【问题描述】:

我想使用 Pandas 数据透视表的输出创建一个相对开始日期表。数据透视表的列是月份,行是帐户,单元格是操作的总和。例如:

Date1     Date2     Date3     Date4
1         1             2         3
N/A       1             2         2

第一行的第一个实例是 Date1。 第二行的第一个实例是 Date2。

新表将被格式化,使得列现在是相对于第一个操作的月份,并且看起来像:

FirstMonth     SecondMonth     ThirdMonth
1                 1             2
1                 2             2

在 pandas 中创建初始数据透视表很简单,我很好奇是否有任何关于如何开发相对起点表的建议。谢谢!

【问题讨论】:

  • df.diff(axis=1)?
  • 那么从第一张桌子到第二张桌子是个问题?
  • @ALollz,正确。我目前有第一个表,我希望将其转换为第二个。
  • 我想我想出的任何东西基本上都是stackoverflow.com/questions/47897166/…的副本。应用sorted 是一个简洁但缓慢的解决方案。否则,您可以使用justify 解决方案,例如:pd.DataFrame(justify(df.to_numpy(), invalid_val = 'N/A'))

标签: python pandas time-series


【解决方案1】:

首先,确保您的数据框列是实际的日期时间值。然后您可以运行以下命令来计算每个日期的操作总和,然后按月份对这些值进行分组并计算相应的每月总和:

>>>df

2019-01-01  2019-01-02  2019-02-01
Row
0             4          22          40
1            22          67          86
2            72          27          25
3             0          26          60
4            44          62          32
5            73          86          81
6            81          17          58
7            88          29          21
>>>df.sum().groupby(df.sum().index.month).sum()

1    720
2    403

如果你想让它反映你上面的内容:

>>> out = df.sum().groupby(df.sum().index.month).sum().to_frame().T
>>> out.columns = [datetime.datetime.strftime(datetime.datetime.strptime(str(x),'%m'),'%B') for x in out.columns]
>>> out
   January  February
0      720      403

如果我误解了你,你希望它按记录/行分开:

>>> df.T.groupby(df.T.index.month).sum().T
1   2
Row
0     26  40
1     89  86
2     99  25
3     26  60
4    106  32
5    159  81
6     98  58
7    117  21

如上重命名列。

【讨论】:

  • 所以,我实际上是在尝试保持原始数据未聚合。最终状态是我将有一个表格,其中每列是第一/第二/第三个月,所以我可以查看每个帐户在相同相对时间段内的趋势(即在第 1 个月和第 2 个月之间,帐户正在增加活动。第 2 个月到第 3 个月它们会减少活动等)。
  • 你看到底部的更新了吗?我相信它可以满足您的需求,并按行提供每月总计。 df.T.groupby(df.T.index.month).sum().T
【解决方案2】:

诀窍是结合使用 .apply() 和 dropna()。

df.T.apply(lambda x: pd.Series(x.dropna().values)).T

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多