【问题标题】:Convert Dataframe into pivot with grouping of values into a list将数据框转换为枢轴,并将值分组为列表
【发布时间】:2021-03-12 12:40:29
【问题描述】:

问题

我正在处理一个现有的具有值的 excel 表,它需要以一种方式进行转换,即我希望收集的不同值分布在不同的列中,并针对我需要列出(并最终附加)其中一个的唯一值列的值。

输入

sr_no, branch_code, Tier1, Tier2, Tier3, Rural
1, 12, Mumbai, Thane, 0, 0
2, 33, Navi Mumbai, Pimpri, Lonavala, 0
3, 120, Pune, Pimpri, 0, 0
4, 8, Surat, Saputara, 0, Silvassa
5, 15, Pune, Nashik, Saputara, 0 
6, 49, Banglore, Mumbai, 0, Saputara

我希望从中扫描唯一值的列如下:
["Tier1", "Tier2", "Tier3", "Rural"] --- (A)

获取唯一值不是问题, ["Mumbai", "Thane", "Navi" "Pimpri", "Surat", "Pune", "Saputara", "Silvassa", "Nashik", "Banglore"]
在每条记录上扫描/匹配唯一值以收集 branch_code 是一项挑战。

试炼

我尝试将 (A) 中所需列的组合值合并到一个列表中。

BranchMaster = pd.read_excel("BranchMaster.xlsx")

scan_cols = ["Tier1", "Tier2", "Tier3", "Rural"]
BranchMaster["Combined"] = BranchMaster.loc[:, scan_cols].values.tolist()

现在,我可以逐条迭代并收集分支代码,但我相信必须有一种更优化的方法来做到这一点。

所需的输出

这个输出我只需要 Dataframe 格式,所以我是否可以将值存储在 CSV、TSV 等中都没关系。

city, branch_code
Mumbai, [12, 49]
Thane, [12]
Navi Mumbai, [33]
Pimpri, [33, 120]
Surat, [8]
Pune, [120, 15]
Saputara, [8, 15, 49]
Silvassa, [8]
Nashik, [15]
Banglore, [49]

【问题讨论】:

    标签: python pandas dataframe csv aggregate


    【解决方案1】:

    您可以使用melt 和 groupby:

    (df.melt('branch_code', ["Tier1", "Tier2", "Tier3", "Rural"],
             value_name='city')
       .loc[lambda x: x['city']!='0']
       .groupby('city')['branch_code'].agg(list)
       .reset_index()
    )
    

    输出:

               city  branch_code
    0      Banglore         [49]
    1      Lonavala         [33]
    2        Mumbai     [12, 49]
    3        Nashik         [15]
    4   Navi Mumbai         [33]
    5        Pimpri    [33, 120]
    6          Pune    [120, 15]
    7      Saputara  [8, 15, 49]
    8      Silvassa          [8]
    9         Surat          [8]
    10        Thane         [12]
    

    【讨论】:

    • 由于某种原因,branch_code 列表显示了冗余值。我在聚合时尝试设置,但随后无法将其重新放入列表中(使用astype())。但是,我的实际数据中似乎存在一些 NaN。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2016-03-08
    相关资源
    最近更新 更多