Python 基于另一数据帧中的多个位置填充表格

Python 基于另一数据帧中的多个位置填充表格,python,pandas,Python,Pandas,我有两个数据帧。一是: Age,Name,Dog,Cat,House,Car,Food 12,'Bob',0,0,0,0,0 12,'Sam',0,0,0,0,0 18,'Sam',0,0,0,0,0 我有一张更长的桌子 Age,Name,Item,Amount 12,'Bob','Dog',1 12,'Bob','Cat',3 12,'Sam','Cat',1 18,'Sam','Cat',1 18,'Sam','House',3 最终产品: Age,Name,Dog,Ca

我有两个数据帧。一是:

Age,Name,Dog,Cat,House,Car,Food

12,'Bob',0,0,0,0,0

12,'Sam',0,0,0,0,0

18,'Sam',0,0,0,0,0
我有一张更长的桌子

Age,Name,Item,Amount

12,'Bob','Dog',1

12,'Bob','Cat',3

12,'Sam','Cat',1

18,'Sam','Cat',1

18,'Sam','House',3
最终产品:

Age,Name,Dog,Cat,House,Car,Food

12,'Bob',1,0,0,0,0

12,'Sam',0,1,0,0,0

18,'Sam',0,1,3,0,0
基本上,我必须用第二个表中的值填充第一个表。 我必须将年龄和姓名从第一个表匹配到第二个表,然后查看第二个表中给出的第一个表中的哪一列,并填写金额


我已经使用了三种条件对其进行了硬编码,但我有数百万行/列,因此如果我这样做的话,实际上需要几天才能运行。

您不需要第一个df,只需在df2上使用
pivot\u表即可:

import pandas as pd
from io import StringIO

# your sample data
s2 = """Age,Name,Item,Amount

12,'Bob','Dog',1

12,'Bob','Cat',3

12,'Sam','Cat',1

18,'Sam','Cat',1

18,'Sam','House',3"""

df2 = pd.read_csv(StringIO(s2), quotechar="'")


# use pivot_table to reshape your dataFrame and reset your index
df2.pivot_table('Amount', ['Age', 'Name'], 'Item', aggfunc=sum).reset_index()

Item  Age Name  Cat  Dog  House
0      12  Bob  3.0  1.0    NaN
1      12  Sam  1.0  NaN    NaN
2      18  Sam  1.0  NaN    3.0
或者只需使用
groupby
unstack

df2.groupby(['Age', 'Name', 'Item'])['Amount'].sum().unstack().reset_index()

Item  Age Name  Cat  Dog  House
0      12  Bob  3.0  1.0    NaN
1      12  Sam  1.0  NaN    NaN
2      18  Sam  1.0  NaN    3.0
对于第一个示例,只需将
aggfunc
更改为要用于处理多个值的任何函数,将
groupby
更改为
.sum()
即可

回答您真正问题的更新:替换df中的值:
伙计,非常感谢!它没有按照我希望的方式完成(即,基于多个其他列的多个替换列的最快方式是什么),但不管这种情况如何,它都能完成任务。再次感谢。@roushrsh我添加了一个更新,它基于另一个数据帧回答了您关于多重替换列的问题
import pandas as pd
from io import StringIO

# your sample data

s = """Age,Name,Dog,Cat,House,Car,Food

12,'Bob',0,0,0,0,0

12,'Sam',0,0,0,0,0

18,'Sam',0,0,0,0,0"""

df1 = pd.read_csv(StringIO(s), quotechar="'")

s2 = """Age,Name,Item,Amount

12,'Bob','Dog',1

12,'Bob','Cat',3

12,'Sam','Cat',1

18,'Sam','Cat',1

18,'Sam','House',3"""

df2 = pd.read_csv(StringIO(s2), quotechar="'")


# use pivot_table to reshape your dataFrame
pivot = df2.pivot_table('Amount', ['Age', 'Name'], 'Item', aggfunc=sum)

# set the index to age and name and create a new df
df1 = df1.set_index(['Age', 'Name'])

# use update to replace values
df1.update(pivot)
print(df1.reset_index())

   Age Name  Dog  Cat  House  Car  Food
0   12  Bob  1.0  3.0    0.0    0     0
1   12  Sam  0.0  1.0    0.0    0     0
2   18  Sam  0.0  1.0    3.0    0     0