Pandas:将值从一个 Dataframe 复制到另一个其他值匹配的 Dataframe

dgiusagp  于 2022-10-23  发布在  其他
关注(0)|答案(2)|浏览(412)

第一次问问题,请原谅我。处理两个不同的 Dataframe ,一个包含州级数据,另一个包含个人级数据(在州内)
测量框架:
||地点|年份|年龄|吸烟|
| ------------ | ------------ | ------------ | ------------ | ------------ |
|1 |纽约| 2000 | 15 |错误|
|2 |纽约| 2000 | 17 |真|
|3 |纽约| 2001 | 13 |真|
|4 |纽约| 2001 | 16 |错误|
|5 | SD | 2000 | 15 |错误|
|6 | SD | 2000 | 17 |正确|
|7 | SD | 2001 | 13 |正确|
|8 | SD | 2001 | 16 |错误|

税收框架:
||位置|年份|子度量|值|
| ------------ | ------------ | ------------ | ------------ | ------------ |
|1 |纽约| 2000 |总税/包| 0.50|
|2 |纽约| 2000 |每包平均成本| 5.50|
|3 |纽约| 2001 |每包税总额| 0.75|
|4 |纽约| 2001 |每包平均成本| 5.75|
|5 | SD | 2000 |总税/包| 0.10|
|6 | SD | 2000 |每包平均成本| 3.25|
|7 | SD | 2001 |每包总税额| 0.10|
|8 | SD | 2001 |每包平均成本| 3.25|

愿望:
||地点|年份|年龄|烟量|总税/包|平均成本/包|
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
|1 |纽约| 2000 | 15 |假| 0.50 | 5.50|
|2 |纽约| 2000 | 17 |真实| 0.50 | 5.50|
|3 |纽约| 2001 | 13 |真实| 0.75 | 5.75|
|4 |纽约| 2001 | 16 |错误| 0.75 | 5.75|
|5 | SD | 2000 | 15 |错误| 0.10 | 3.25|
|6 | SD | 2000 | 17 |真| 0.10 | 3.25|
|7 | SD | 2001 | 13 |正确| 0.10 | 3.25|
|8 | SD | 2001 | 16 |错误| 0.10 | 3.25|
使用大约10个州的数据,包括多个子指标和超过20万个人。
我的第一个想法是遍历附加到调查名称的每一列,从税务框架中填写价值,其中位置和年份与当前indes的位置和年份相匹配,但这似乎效率低下。有没有更好的方法来处理Pandas?
谢谢

b4lqfgs4

b4lqfgs41#

您可以使用Pandas来合并 Dataframe 。

import pandas as pd    

df1 = Surveyframe
df2 = taxframe

new_df = pd.merge(df1, df2,  how='left', on=['Location','Year'])

这应该是你想要的。此代码将执行左联接。还有其他联接类型:
如何{“左”、“右”、“外”、“内”、“交叉”}、默认的“内”要执行的合并类型。
left:仅使用左框架中的键,类似于SQL左外部连接;保留密钥顺序。
right:仅使用右框架中的键,类似于SQL右外部连接;保留密钥顺序。
outer:使用来自两个帧的键的联合,类似于SQL完全外部连接;按词典顺序对关键字进行排序。
内部:使用两个帧的键的交集,类似于SQL内部连接;保留左键的顺序。
cross:从两个帧创建笛卡尔积,保留左键的顺序。
此外,确保在两个 Dataframe 中用作键的标头相同(例如,位置、年份)。否则,如果名称不同,可以使用left_on和right_on。

l2osamch

l2osamch2#

制作如下。函数my_func中有一个按列“Location”、“Year”分组的方法。x、 values[0][0]是位置,x.values0是年份。根据“taxframe”数据框中的这些值进行选择。
接下来,从过滤后的数据中,我们得到“价值”,其中“总税/包”和“平均成本/包”。
我们通过loc替换值(loc是行索引左侧的显式索引,右侧是列的名称)。在这里你可以阅读关于loc的信息。

import pandas as pd
import numpy as np

Surveyframe['Total Tax/Pack'] = np.nan
Surveyframe['Avg Cost/Pack'] = np.nan

def my_func(x):
    filt = taxframe.loc[(taxframe['Location'] == x.values[0][0]) & (taxframe['Year'] == x.values[0][1])]
    ttp = filt[filt['SubMeasure'] == 'Total Tax/Pack']['Value']
    acp = filt[filt['SubMeasure'] == 'Avg Cost/Pack']['Value']

    Surveyframe.loc[x.index, 'Total Tax/Pack'] = ttp.values[0]
    Surveyframe.loc[x.index, 'Avg Cost/Pack'] = acp.values[0]

Surveyframe.groupby(['Location', 'Year']).apply(my_func)

print(Surveyframe)

输出

Location  Year  Age  Smokes  Total Tax/Pack  Avg Cost/Pack
0       NY  2000   15   False            0.50           5.50
1       NY  2000   17    True            0.50           5.50
2       NY  2001   13    True            0.75           5.75
3       NY  2001   16   False            0.75           5.75
4       SD  2000   15   False            0.10           3.25
5       SD  2000   17    True            0.10           3.25
6       SD  2001   13    True            0.10           3.25
7       SD  2001   16   False            0.10           3.25

相关问题