为了进行分析,我获得了一个列名,其中包含有关产品,市场和分销的特定信息。
数据集的结构如下:
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列。
我试图通过匹配字符串在熊猫中做到这一点,但我真的很困。感谢您的帮助!
答案 0 :(得分:3)
您似乎可以使用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
答案 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
答案 2 :(得分:1)
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]