pandas 使用组中其他数据框的列填充一个数据框的列

fslejnso  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(128)

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

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

我有另一个 Dataframe 如下所述。

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

现在我想用df 1中的值填充df 2的“dr”、“a”、“de”列,以便对于2022-01-01,从df 1的“dr 1”、“a1”、“de 1”列填充值。对于2022-01-02,从“dr 2”、“a2”、“de 2”列填充值。对于2022-01-03,从“dr 3”填充值,“a3”、“de 3”等。每个组的日期都是升序排列的,并且有多个组。
我试过使用排名方法对df 2进行日期排名并填充列,但它不起作用。

y4ekin9u

y4ekin9u1#

试试看:

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

对其他两列重复此操作,只做一点更改。

sulc1iza

sulc1iza2#

不清楚您如何准确地生成日期(我假设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
xtfmy6hx

xtfmy6hx3#

def function1(dd:pd.DataFrame):
    return dd.rename(columns=lambda x:x[:-1])

df11=df1.loc[:,"dr1":]
col1=df11.columns.str[-1]
df12=pd.concat(pd.DataFrame(df11.groupby(col1,axis=1))[1].map(function1).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

相关问题