【问题标题】:How to split concatenated column name into separate columns?如何将连接的列名拆分为单独的列?
【发布时间】:2019-12-17 06:20:45
【问题描述】:

为了进行分析,我得到了一个列名,其中包含有关产品、市场和分销的具体信息。

数据集的结构如下:

Date     Product1|CBA|MKD  Product1|CPA|MKD     Product1|CBA|IHR    Product2|CBA|IHR
2018-11  12                 23                   0                   2

有很多独特的列组合。我想做的是得到以下结构:

Date      Product    Partner   Market      Quantity
2020-1    Product1   CBA       MKD         11
2020-1    Product1   CPA       MKD         22
2020-1    Product1   CBA       IHR         0
2020-1    Product2   CBA       IHR         1

所以,我想创建 3 个不同的列,并用列名中的粘贴值填充它们。数量列显然会包含旧连接列的值(我知道该怎么做),问题是获得前 3 列。

我试图通过匹配字符串在熊猫中做到这一点,但我真的被卡住了。非常感谢您的帮助,谢谢!

【问题讨论】:

  • 您是否有定期命名的列?例如,您的第一列以A|B|C| 的形式命名,末尾有一个额外的管道,而其他列是A|B|C
  • 感谢您的关注,我将进行编辑。它们都定期命名。

标签: python string pandas split


【解决方案1】:

看来你可以使用pandas.melt

df_ = df.melt(id_vars = 'Date', value_name = 'Quantity')
df_[['Product', 'Partner','Market']] = df_.variable.str.split('|', 
                                                             expand = True)\
                                                        .dropna(axis = 1) 
df_.pop('variable')
df_
Out[67]: 
      Date  Quantity   Product Partner Market
0  2018-11        12  Product1     CBA    MKD
1  2018-11        23  Product1     CPA    MKD
2  2018-11         0  Product1     CBA    IHR
3  2018-11         2  Product2     CBA    IHR

【讨论】:

  • 这并没有给出预期的结果。
  • 我没有添加 Date 列,因为我认为这并不重要,但我编辑了我的答案以包含它以防万一。
  • 这不是唯一的事情。不过现在看起来好多了! +1
  • 在您编辑之前我自己添加的日期;)感谢您编辑,以防其他人遇到同样的问题?
【解决方案2】:

这是另一种方法:

st = df.set_index("Date").stack().reset_index(-1)
res = st["level_1"].str.split("|")
st[["Product","Partner","Market"]] = pd.DataFrame(res.tolist(), index=st.index)
df2 = st.drop("level_1", axis=1).rename({0:"Quantity"}, axis=1)

print(df2)
         Quantity   Product Partner Market
Date
2018-11        12  Product1     CBA    MKD
2018-11        23  Product1     CPA    MKD
2018-11         0  Product1     CBA    IHR
2018-11         2  Product2     CBA    IHR

【讨论】:

    【解决方案3】:
    a = df.melt(id_vars=["Date"],var_name="Product", 
        value_name="Val").dropna(how='any').sort_values('Date')
    a['Partner'] = a['Product'].str.split("|").str[1]
    a['Market'] = a['Product'].str.split("|").str[-1]
    a['Product']= a['Product'].str.split("|").str[0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2018-05-17
      • 2019-11-05
      • 1970-01-01
      • 2013-08-02
      • 2017-11-02
      相关资源
      最近更新 更多