如何在同一python代码中使用内部联接和groupby

如何在同一python代码中使用内部联接和groupby,python,pandas,pandas-groupby,python-3.7,Python,Pandas,Pandas Groupby,Python 3.7,我从excel文件Sheet1和Sheet2中获得以下输入 表1: 订单ID |订单日期|细分|销售 10011-11-2016消费者100 10011-11-2016消费者200 2001-16-06-2016消费者300 第2张: 返回|订单ID 是1001 我在python中使用下面的代码,其中我使用内部连接和groupby只从两个工作表中获取匹配的记录 作为pd进口熊猫 Sheet1=pd.read\u excel rC:\Users\Bharath Shana\Desktop\Pyth

我从excel文件Sheet1和Sheet2中获得以下输入

表1:

订单ID |订单日期|细分|销售

10011-11-2016消费者100

10011-11-2016消费者200

2001-16-06-2016消费者300

第2张:

返回|订单ID

是1001

我在python中使用下面的代码,其中我使用内部连接和groupby只从两个工作表中获取匹配的记录

作为pd进口熊猫

Sheet1=pd.read\u excel rC:\Users\Bharath Shana\Desktop\Python\sample data.xlsx,sheet\u name='Sheet1'

Sheet2=pd.read\u excel rC:\Users\Bharath Shana\Desktop\Python\sample data.xlsx,sheet\u name='Sheet2'

订单年=pd.DatetimeIndexSheet1[“订单日期”].Year

Sheet1.mergeSheet2,on='Order ID',how='inner'

表1.groupby['Order ID',Order_Year','Segment']['Sales'].合计

输出:

正如您在上面的输出中看到的,它不是显示匹配的记录,而是显示所有记录,我希望输出如下

所需输出:

有人能帮我修改上面的python代码以获得所需的输出吗

问候,

维卡斯

让我们试试这个

print(
    sheet1[sheet1['Order ID'].isin(sheet2['Order ID'])]
        .assign(Year=pd.to_datetime(sheet1['Order Date']).dt.year)
        .groupby(['Order ID', 'Segment', 'Year'])['Sales'].sum()
        .reset_index(name="Sales_Sum")
)
让我们试试这个

print(
    sheet1[sheet1['Order ID'].isin(sheet2['Order ID'])]
        .assign(Year=pd.to_datetime(sheet1['Order Date']).dt.year)
        .groupby(['Order ID', 'Segment', 'Year'])['Sales'].sum()
        .reset_index(name="Sales_Sum")
)

在您的问题中,您将groupby应用于Sheet1,而不是连接的数据帧

s1 = '''Order ID  Order Date  Segment  Sales
1001       11-11-2016   Consumer  100
1001       11-11-2016   Consumer  200
2001       16-06-2016   Consumer  300'''
s2 = '''Returned  Order ID
Yes        1001'''
s1 = [[t.strip() for t in re.split("  ", l) if t!=""] for l in s1.split("\n") ]
s2 = [[t.strip() for t in re.split("  ", l) if t!=""] for l in s2.split("\n") ]
Sheet1 = pd.DataFrame(s1[1:], columns=s1[0])
Sheet1["Year"] = pd.DatetimeIndex(Sheet1['Order Date']).year
Sheet1["Sales"] = pd.to_numeric(Sheet1["Sales"])
Sheet2 = pd.DataFrame(s2[1:], columns=s2[0])
Sheet1.merge(Sheet2, on='Order ID', how='inner')\
    .groupby(['Order ID','Year', 'Segment']).agg(Sales_sum=("Sales", np.sum)).reset_index()
输出


在您的问题中,您将groupby应用于Sheet1,而不是连接的数据帧

s1 = '''Order ID  Order Date  Segment  Sales
1001       11-11-2016   Consumer  100
1001       11-11-2016   Consumer  200
2001       16-06-2016   Consumer  300'''
s2 = '''Returned  Order ID
Yes        1001'''
s1 = [[t.strip() for t in re.split("  ", l) if t!=""] for l in s1.split("\n") ]
s2 = [[t.strip() for t in re.split("  ", l) if t!=""] for l in s2.split("\n") ]
Sheet1 = pd.DataFrame(s1[1:], columns=s1[0])
Sheet1["Year"] = pd.DatetimeIndex(Sheet1['Order Date']).year
Sheet1["Sales"] = pd.to_numeric(Sheet1["Sales"])
Sheet2 = pd.DataFrame(s2[1:], columns=s2[0])
Sheet1.merge(Sheet2, on='Order ID', how='inner')\
    .groupby(['Order ID','Year', 'Segment']).agg(Sales_sum=("Sales", np.sum)).reset_index()
输出