Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过两个表的一列中的公共值对两个表进行求和_Python_Pandas_Dataframe - Fatal编程技术网

Python 通过两个表的一列中的公共值对两个表进行求和

Python 通过两个表的一列中的公共值对两个表进行求和,python,pandas,dataframe,Python,Pandas,Dataframe,d以小时为单位,以所有者或经理的身份保存有关人员计划和实际工作时间的数据。 请注意,一个人可以(但不必)同时成为所有者和经理 我需要重新排列d,以便在一列和其他列中提供所有名称 每个角色的计划和实际工时 下面的代码实现了这一点,但不是很漂亮 我如何利用一些本地Pandas功能获得相同的结果,但输入更少 import pandas as pd d = { 'owner': ['mike', 'john', 'jake', 'lucy', 'mary', 'hans'], 'own

d
以小时为单位,以所有者或经理的身份保存有关人员计划和实际工作时间的数据。 请注意,一个人可以(但不必)同时成为所有者和经理

我需要重新排列
d
,以便在一列和其他列中提供所有名称 每个角色的计划和实际工时

下面的代码实现了这一点,但不是很漂亮

我如何利用一些本地Pandas功能获得相同的结果,但输入更少

import pandas as pd

d = {
    'owner': ['mike', 'john', 'jake', 'lucy', 'mary', 'hans'],
    'owner planned': [54, 67, 52, 19, 87, 45],
    'owner actual': [12, 54, 3, 67, 84, 22],
    'manager': ['andrew', 'tom', 'john', 'mike', 'hans', 'paul'],
    'manager planned': [13, 432, 453, 765, 432, 234], 
    'manager actual': [22, 33, 44, 55, 66, 77],
}

df = pd.DataFrame(d)
names = list(set(df['owner'].tolist() + df['manager'].tolist()))
output = {}

for name in names:
    op = df[df['owner'] == name]['owner planned'].sum()
    oa = df[df['owner'] == name]['owner actual'].sum()
    mp = df[df['manager'] == name]['manager planned'].sum()
    ma = df[df['manager'] == name]['manager actual'].sum()

    output.setdefault('owner_planned', []).append(op)
    output.setdefault('owner_actual', []).append(oa)
    output.setdefault('manager_planned', []).append(mp)
    output.setdefault('manager_actual', []).append(ma)
    output.setdefault('names', []).append(name)

df2 = pd.DataFrame(output)
print(df2)
输出:


使用
filter
concat
DataFrameGroupBy.sum

u = df.filter(like='owner').rename({'owner':'names'}, axis=1)
v = df.filter(like='manager').rename({'manager':'names'}, axis=1)

pd.concat([u,v], sort=False).groupby('names').sum()

        owner planned  owner actual  manager planned  manager actual
names                                                               
andrew            0.0           0.0             13.0            22.0
hans             45.0          22.0            432.0            66.0
jake             52.0           3.0              0.0             0.0
john             67.0          54.0            453.0            44.0
lucy             19.0          67.0              0.0             0.0
mary             87.0          84.0              0.0             0.0
mike             54.0          12.0            765.0            55.0
paul              0.0           0.0            234.0            77.0
tom               0.0           0.0            432.0            33.0
    manager actual  manager planned owner actual    owner planned
name                
andrew  22.0    13.0    0.0 0.0
hans    66.0    432.0   22.0    45.0
jake    0.0 0.0 3.0 52.0
john    44.0    453.0   54.0    67.0
lucy    0.0 0.0 67.0    19.0
mary    0.0 0.0 84.0    87.0
mike    55.0    765.0   12.0    54.0
paul    77.0    234.0   0.0 0.0
tom 33.0    432.0   0.0 0.0
u = df.filter(like='owner').rename({'owner':'names'}, axis=1)
v = df.filter(like='manager').rename({'manager':'names'}, axis=1)

pd.concat([u,v], sort=False).groupby('names').sum()

        owner planned  owner actual  manager planned  manager actual
names                                                               
andrew            0.0           0.0             13.0            22.0
hans             45.0          22.0            432.0            66.0
jake             52.0           3.0              0.0             0.0
john             67.0          54.0            453.0            44.0
lucy             19.0          67.0              0.0             0.0
mary             87.0          84.0              0.0             0.0
mike             54.0          12.0            765.0            55.0
paul              0.0           0.0            234.0            77.0
tom               0.0           0.0            432.0            33.0