Python Pandas连接或整形数据以添加两个具有重复值的新列

时间:2017-03-30 00:40:30

标签: python pandas

确定。我不知道如何实际问这个问题但是这里有。我有这样的数据框。

import pandas as pd

d = {'Product' : ['Product_A','Product_A', 'Product_B', 'Product_B'],'Country' : ["DE", "DE", "DE","DE"],'Billed_Week' : ['201652', '201701', '201652', '201701'],'Billings' : [1116, 9030, 7476, 2859]}
df = pd.DataFrame(d)

sequence = ['Product','Country','Billed_Week','Billings']
df = df.reindex(columns=sequence)

输出:

    Product   Country  Billed_Week  Billings
0  Product_A      DE     201652      1116
1  Product_A      DE     201701      9030
2  Product_B      DE     201652      7476
3  Product_B      DE     201701      2859

我需要再添加两列" Billed_Week_New"和" Billings_New"它们根据整个第一个数据帧的分组以重复格式添加值。因此,对于第一个数据帧的第一个记录,我需要扩展整个分组中的周数。我将只显示所需的输出。

需要输出:

Product    Country  Billed_Week  Billings   Billed_Week_New   Billings_New
Product_A   DE       201652       1116        201652             1116
Product_A   DE       201652       1116        201701             9030
Product_A   DE       201701       9030        201652             1116
Product_A   DE       201701       9030        201701             9030
Product_B   DE       201652       7476        201652             7476
Product_B   DE       201652       7476        201701             2859
Product_B   DE       201701       2859        201652             7476
Product_B   DE       201701       2859        201701             2859

1 个答案:

答案 0 :(得分:3)

考虑交叉连接,在列之间返回笛卡尔积(这些相同键之间的所有可能组合在 Product Country ):

mdf = df.merge(df, on=['Product','Country']).\
      rename(columns = {'Billed_Week_x': 'Billed_Week',
                        'Billings_x': 'Billings',
                        'Billed_Week_x':'Billed_Week_New',
                        'Billings_y':'Billings_New'})
print(mdf)

#      Product Country Billed_Week  Billings Billed_Week_New  Billings_New
# 0  Product_A      DE      201652      1116          201652          1116
# 1  Product_A      DE      201652      1116          201701          9030
# 2  Product_A      DE      201701      9030          201652          1116
# 3  Product_A      DE      201701      9030          201701          9030
# 4  Product_B      DE      201652      7476          201652          7476
# 5  Product_B      DE      201652      7476          201701          2859
# 6  Product_B      DE      201701      2859          201652          7476
# 7  Product_B      DE      201701      2859          201701          2859