【问题标题】:Fill columns of one data frame with columns of other dataframe on group用组中其他数据框的列填充一个数据框的列
【发布时间】:2023-02-15 14:52:55
【问题描述】:

我有一个包含多个列的数据框,如下所述。

df1 
a  b  c  d  e  f   dr1    a1     de1    dr2   a2     de2     dr3   a3     de3   dr4    a4     de4
x  y  z  1  2  3   abc  08:00   09:00   abc  07:00  08:00   abc  08:00   09:00  abc  08:00   09:00
x1 y1 z1 7  9  2   abc  14:00   15:00   abc  14:00  15:00   abc  13:00   14:00  abc  13:00   14:00
x2 y2 z2 2  4  5   abc  21:00   22:00   abc  20:00  21:00   abc  20:00   21:00  abc  20:00   21:00

我有另一个数据框,如下所述。

df2
a   b   c   d   e   f      date       dr   a   de
x   y   z   1   2   3   2022-01-01
x   y   z   1   2   3   2022-01-02
x   y   z   1   2   3   2022-01-03
x   y   z   1   2   3   2022-01-04
x1 y1  z1   7   9   2   2022-01-01
x1 y1  z1   7   9   2   2022-01-02
x1 y1  z1   7   9   2   2022-01-03
x1 y1  z1   7   9   2   2022-01-04
x2 y2  z2   2   4   5   2022-01-01
x2 y2  z2   2   4   5   2022-01-02
x2 y2  z2   2   4   5   2022-01-03
x2 y2  z2   2   4   5   2022-01-04

现在我想用 df1 的值填充 df2 的“dr”、“a”、de“列,这样对于 2022-01-01,值从 df1 的“dr1”、“a1”、“de1”列填充. 对于 2022-01-02,值从“dr2”、“a2”、“de2”列填充。对于 2022-01-03,值从“dr3”、“a3”、“de3”等填充. 每个组的日期按升序排列,并且有多个组。

我曾尝试使用 Rank 方法按日期对 df2 进行排名并填充列,但它不起作用。

【问题讨论】:

  • 请以可以作为数据框复制的格式发布您的数据。
  • 日期来自哪里?
  • @mozway Date 使用 start_date = pd.to_datetime('2022-01-01') 添加到代码中,然后在一组列上使用 transform 和 groupby 方法

标签: pandas dataframe


【解决方案1】:

尝试:

df2['dr'] = df1[[x for x in df1.columns if 'dr' in x]].T

对其他两列重复此操作并稍作更改。

【讨论】:

    【解决方案2】:

    目前尚不清楚您是如何生成日期的(我假设 2021-12-31 + 列名称上的数字定义的天数)。

    对于一般重塑,您需要pandas.wide_to_long:

    df2 = (pd
           .wide_to_long(df.rename(columns={'a':'A'}),
                         stubnames=['dr', 'a', 'de'],
                         i=['A', 'b', 'c', 'd', 'E', 'f'],
                         j='date')
           .reset_index()
           .assign(date=lambda d: pd.Timestamp('2021-12-31')+pd.to_timedelta(d['date'], unit='d'))
           )
    

    请注意,您不能有重复的列名,因此您首先需要重命名“a”(此处为“A”)。

    输出:

         A   b   c  d  E  f       date   dr      a     de
    0    x   y   z  1  2  3 2022-01-01  abc  08:00  09:00
    1    x   y   z  1  2  3 2022-01-02  abc  07:00  08:00
    2    x   y   z  1  2  3 2022-01-03  abc  08:00  09:00
    3    x   y   z  1  2  3 2022-01-04  abc  08:00  09:00
    4   x1  y1  z1  7  9  2 2022-01-01  abc  14:00  15:00
    5   x1  y1  z1  7  9  2 2022-01-02  abc  14:00  15:00
    6   x1  y1  z1  7  9  2 2022-01-03  abc  13:00  14:00
    7   x1  y1  z1  7  9  2 2022-01-04  abc  13:00  14:00
    8   x2  y2  z2  2  4  5 2022-01-01  abc  21:00  22:00
    9   x2  y2  z2  2  4  5 2022-01-02  abc  20:00  21:00
    10  x2  y2  z2  2  4  5 2022-01-03  abc  20:00  21:00
    11  x2  y2  z2  2  4  5 2022-01-04  abc  20:00  21:00
    

    【讨论】:

      【解决方案3】:
      df11=df1.loc[:,"dr1":]
      col1=df11.columns.str[-1]
      df12=pd.concat(pd.DataFrame(df11.groupby(col1,axis=1))[1].map(lambda dd:dd.rename(columns=lambda x:x[:-1])).tolist()).sort_index().reset_index(drop=True)
      
      df2.join(df12)
      

      出去:

        A   b   c  d  e  f        date   dr      a     de
      0    x   y   z  1  2  3  2022-01-01  abc  08:00  09:00
      1    x   y   z  1  2  3  2022-01-02  abc  07:00  08:00
      2    x   y   z  1  2  3  2022-01-03  abc  08:00  09:00
      3    x   y   z  1  2  3  2022-01-04  abc  08:00  09:00
      4   x1  y1  z1  7  9  2  2022-01-01  abc  14:00  15:00
      5   x1  y1  z1  7  9  2  2022-01-02  abc  14:00  15:00
      6   x1  y1  z1  7  9  2  2022-01-03  abc  13:00  14:00
      7   x1  y1  z1  7  9  2  2022-01-04  abc  13:00  14:00
      8   x2  y2  z2  2  4  5  2022-01-01  abc  21:00  22:00
      9   x2  y2  z2  2  4  5  2022-01-02  abc  20:00  21:00
      10  x2  y2  z2  2  4  5  2022-01-03  abc  20:00  21:00
      11  x2  y2  z2  2  4  5  2022-01-04  abc  20:00  21:00
      

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 2022-10-07
        • 2017-12-26
        • 1970-01-01
        • 2018-12-08
        • 2023-03-04
        • 2016-02-14
        • 2017-03-11
        • 1970-01-01
        相关资源
        最近更新 更多