【问题标题】:Regroup the data in one dataframe using the information from another dataframe使用来自另一个数据帧的信息重新组合一个数据帧中的数据
【发布时间】:2021-06-11 22:36:15
【问题描述】:

我有以下两个数据框:

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

和

df_two
                A      B      C
2020-01-01    Jan    Feb  March
2020-01-02    Jan    Feb  March
2020-01-03    Feb  March    Jan
2020-01-04    Feb  March    Jan
2020-01-05  March    Jan    Feb
2020-01-06  March    Jan    Feb

我想利用这两个数据框的信息,得到如下视图:

            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

我该怎么做?

【问题讨论】:

  • 只需将df_one的列重命名为df_one.columns=['Jan','Feb','March']或使用rename()方法

标签: python pandas dataframe group-by mask


【解决方案1】:

你可以试试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)

分辨率:

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

映射月份 (Jan, Feb, March) 和 values

映射将如下所示:

{'Jan': 2, 'Feb': 12, 'March': 82}
{'Jan': 5, 'Feb': 15, 'March': 85}
{'Feb': 16, 'March': 86, 'Jan': 6}
{'Feb': 17, 'March': 87, 'Jan': 7}
{'March': 88, 'Jan': 8, 'Feb': 18}
{'March': 89, 'Jan': 9, 'Feb': 19}

使用它您可以创建一个数据框。

假设它们都具有相同的索引和相同的大小。

一个班轮解决方案:

res = pd.DataFrame([dict(zip(df_two.to_numpy()[idx], l)) for idx,l in enumerate(df_one.to_numpy())], index=df_one.index) 

如果您想处理通用索引。

i = df_one.index.intersection(df_two.index)
res = pd.DataFrame([dict(zip(df_two.loc[i].to_numpy()[idx], l)) for idx,l in enumerate(df_one.loc[i].to_numpy())], index=i)

【讨论】:

    【解决方案2】:

    让我们使用一些 pandas 的整形和连接方法:

    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)
    

    输出:

                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 和 拉链
    • 堆叠每个数据帧和 reset_index 创建通用列标题 合并
    • 使用枢轴重塑结果数据框

    【讨论】:

    • 嘿斯科特..你好吗我的朋友?感谢你们理解这个问题并给出了如此出色的答案......我真的很难理解这个问题本身:-)
    • 我只是查看了所需的输出并使用他的输入复制了它。
    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2021-12-25
      • 2018-12-25
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多