Python 使用来自另一个数据帧的信息重新组合一个数据帧中的数据

Python 使用来自另一个数据帧的信息重新组合一个数据帧中的数据,python,pandas,dataframe,group-by,mask,Python,Pandas,Dataframe,Group By,Mask,我有以下两个数据帧: import pandas as pd from datetime import datetime df_two = pd.DataFrame({'A': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'], 'B': ['Feb', 'Feb', 'March', 'March', 'Jan', 'Jan'], 'C': ['March'

我有以下两个数据帧:

import pandas as pd
from datetime import datetime

df_two = pd.DataFrame({'A': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'],
                       'B': ['Feb', 'Feb', 'March', 'March', 'Jan', 'Jan'],
                       'C': ['March', 'March', 'Jan', 'Jan', 'Feb', 'Feb']},
                      index=[datetime(2020, 1, 1), datetime(2020, 1, 2),
                             datetime(2020, 1, 3), datetime(2020, 1, 4),
                             datetime(2020, 1, 5), datetime(2020, 1,6)] )

df_one = pd.DataFrame({'series_one': [2, 5, 16, 17, 88, 89],
                       'series_two': [12, 15, 86, 87, 8, 9],
                       'series_three': [82, 85, 6, 7, 18, 19]},
                      index=[datetime(2020, 1, 1), datetime(2020, 1, 2),
                             datetime(2020, 1, 3), datetime(2020, 1, 4),
                             datetime(2020, 1, 5), datetime(2020, 1, 6)])
看起来是这样的:

df_one
            series_one  series_two  series_three
2020-01-01           2          12            82
2020-01-02           5          15            85
2020-01-03          16          86             6
2020-01-04          17          87             7
2020-01-05          88           8            18
2020-01-06          89           9            19

我想使用这两个数据帧的信息并获得以下视图:

            Jan  Feb  March
2020-01-01    2   12     82
2020-01-02    5   15     85
2020-01-03    6   16     86
2020-01-04    7   17     87
2020-01-05   88   18     88
2020-01-06   89   19     89

我该怎么做?

如果问题复杂得多,它可能无法解决您的问题,但它可能是一个起点:

pd.DataFrame(list(df_one.apply(lambda x: [x[list(df_two.loc[x.name]=="Jan").index(True)],
                        x[list(df_two.loc[x.name]=="Feb").index(True)],
                        x[list(df_two.loc[x.name]=="March").index(True)]],axis = 1)),
             index = df_one.index,
             columns = ["Jan","Feb", "March"])
输出:

            Jan Feb March
2020-01-01  2   12  82
2020-01-02  5   15  85
2020-01-03  6   16  86
2020-01-04  7   17  87
2020-01-05  8   18  88
2020-01-06  9   19  89
            Feb  Jan  March
2020-01-01   12    2     82
2020-01-02   15    5     85
2020-01-03   16    6     86
2020-01-04   17    7     87
2020-01-05   18    8     88
2020-01-06   19    9     89

您可以尝试使用
apply

def func(row):
    y = df_one.loc[row.name]
    u = (dict(zip(row.values,y.values)))
    return u
res = pd.DataFrame(list(df_two.apply(func,axis=1)), index=df_two.index)
res:

简 二月 前进 2020-01-01 2. 12 82 2020-01-02 5. 15 85 2020-01-03 6. 16 86 2020-01-04 7. 17 87 2020-01-05 8. 18 88 2020-01-06 9 19 89
让我们使用一些重塑和连接方法:

df_one = df_one.rename(columns=dict(zip(df_one.columns, df_two.columns)))
df_out = df_one.stack().reset_index(name='value').merge(df_two.stack().reset_index(name='month'))
df_out = df_out.pivot('level_0', 'month', 'value').rename_axis(index=None, columns=None)
print(df_out)
输出:

            Jan Feb March
2020-01-01  2   12  82
2020-01-02  5   15  85
2020-01-03  6   16  86
2020-01-04  7   17  87
2020-01-05  8   18  88
2020-01-06  9   19  89
            Feb  Jan  March
2020-01-01   12    2     82
2020-01-02   15    5     85
2020-01-03   16    6     86
2020-01-04   17    7     87
2020-01-05   18    8     88
2020-01-06   19    9     89
详情:

  • 首先,让我们使用rename、dict和 拉链
  • 堆叠每个数据帧并重置索引,创建公共列标题 合并
  • 使用pivot重塑生成的数据帧

只需通过
df_one.columns=['Jan','Feb','March']
或使用
rename()
methodHey Scott.你好吗,我的朋友?感谢你们理解了这个问题并给出了如此精彩的答案…我真的很难理解这个问题本身:-)我只是查看了期望的输出,并使用他的输入复制了它。