我有两个数据框。一个是:
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
基本上,我必须用第二个表中的值填充第一个表。 我必须从第一张表到第二张表匹配年龄和姓名,然后查看第二张表中给我的第一张表中的哪一列,并填写金额
我已经使用三个&条件对其进行了硬编码,但是我有数百万行/列,因此如果我这样做,它将花几天的时间运行。
答案 0 :(得分:0)
您不需要您的第一个df,只需在df2上使用pivot_table
:
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()
的任何函数即可。
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