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