Python 3.x 根据给定的键重新构造数据帧

Python 3.x 根据给定的键重新构造数据帧,python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我正在处理一个数据集,经过所有的清理和重组后,我发现数据集如下所示 import pandas as pd df = pd.read_csv('data.csv', dtype={'freq_no': object, 'sequence': object, 'field': object}) print(df) CSV网址: 我想重组上面的结构,使它看起来像下面 import pandas as pd df = pd.read_csv('data.csv', dtype={'freq_no

我正在处理一个数据集,经过所有的清理和重组后,我发现数据集如下所示

import pandas as pd

df = pd.read_csv('data.csv', dtype={'freq_no': object, 'sequence': object, 'field': object})
print(df)
CSV网址:

我想重组上面的结构,使它看起来像下面

import pandas as pd

df = pd.read_csv('data.csv', dtype={'freq_no': object, 'sequence': object, 'field': object})
print(df)
逻辑:

          id  year period freq_no sequence  file_date  data_date  05210  \
0  abcdefghi  2018      A     001      001   20180605   20180331  200.0   
1  abcdefghi  2018      A     001      001   20180605   20180330    NaN   

   05220  05230                combined_note              deleted  
0    NaN    NaN  {05210_B:ABC}{05210_U:DEFF}        note{05210_U:DEFF} #because for note 05210_U:DEFF the trans_type was D  
1  200.0  100.0   {05220_U:xyz}{05230_U:lmn}  note{05220_U:xyz}|05230 #because for note {05220_U:xyz} trans_type is D, we also show field (05230) here separated by pipe because for that row the trans_type is D
  • 使用
    id、年份、期间、频率、序列、数据和日期作为键(groupby?)
  • 转置,使
    字段
    成为列,此列的值为
  • 通过连接
    注释
    (对于相同的键),创建一个
    组合注释
  • 创建一个
    deleted
    列,该列将显示根据
    交易类型D
    删除的
    注释
  • 输出:

              id  year period freq_no sequence  file_date  data_date  05210  \
    0  abcdefghi  2018      A     001      001   20180605   20180331  200.0   
    1  abcdefghi  2018      A     001      001   20180605   20180330    NaN   
    
       05220  05230                combined_note              deleted  
    0    NaN    NaN  {05210_B:ABC}{05210_U:DEFF}        note{05210_U:DEFF} #because for note 05210_U:DEFF the trans_type was D  
    1  200.0  100.0   {05220_U:xyz}{05230_U:lmn}  note{05220_U:xyz}|05230 #because for note {05220_U:xyz} trans_type is D, we also show field (05230) here separated by pipe because for that row the trans_type is D
    

    我认为这可以通过使用
    键上的
    设置索引
    ,然后重新构造其他列来实现,但我无法获得所需的输出。

    因此我不得不通过合并来完成。
    逻辑步骤:

  • 按除注释和值以外的所有字段对数据帧进行分组。这是为了保护字段和事务列不受聚合的影响
  • 添加已删除的列
  • 包含注释聚合的第一个数据帧(也已删除)
  • 将字段和值转换为多列的第二个数据帧
  • 合并索引上的第一个和第二个数据帧 代码:

    输出:

    final
              id  year period freq_no sequence  data_date  file_date  05210  05220  05230                combined_note         deleted
    0  abcdefghi  2018      A     001      001   20180330   20180605    NaN  200.0  100.0   {05220_U:xyz}{05230_U:lmn}   {05220_U:xyz}
    1  abcdefghi  2018      A     001      001   20180331   20180605  200.0    NaN    NaN  {05210_B:ABC}{05210_U:DEFF}  {05210_U:DEFF}
    

    谢谢你的回答。它在给定的数据集上工作,但在此数据集上失败。如果将第三行中的
    freq\u no
    替换为
    001
    ,则其工作正常。我不知道这里出了什么问题。我看到的唯一区别是第一行有一个NaN,到底出了什么问题?正确,但在使用运行代码时,我得到了这个错误
    ValueError:无法在未指定级别和名称重叠的情况下加入。我同时在python2.7和python3.5上运行,无法重现您的错误。输出:我在pandas 0.20.0上得到错误。我没有在0.22.0上注意到它。