根据另一个数据框中的多个位置填充表格

时间:2019-11-06 23:49:24

标签: 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,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

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

我已经使用三个&条件对其进行了硬编码,但是我有数百万行/列,因此如果我这样做,它将花几天的时间运行。

1 个答案:

答案 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

或者仅使用groupbyunstack

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中的值:

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