【问题标题】:Pandas: copy value from one dataframe to another where other values match熊猫:将值从一个数据帧复制到其他值匹配的另一个数据帧
【发布时间】:2022-10-23 21:43:32
【问题描述】:

第一次问问题,请见谅。处理两个不同的数据帧,一个包含州级数据,另一个包含单个级别数据(在州内)

调查框架:

Location Year Age Smokes
1 NY 2000 15 False
2 NY 2000 17 True
3 NY 2001 13 True
4 NY 2001 16 False
5 SD 2000 15 False
6 SD 2000 17 True
7 SD 2001 13 True
8 SD 2001 16 False

ETC...

税框架:

Location Year SubMeasure Value
1 NY 2000 Total Tax/Pack 0.50
2 NY 2000 Avg Cost/Pack 5.50
3 NY 2001 Total Tax/Pack 0.75
4 NY 2001 Avg Cost/Pack 5.75
5 SD 2000 Total Tax/Pack 0.10
6 SD 2000 Avg Cost/Pack 3.25
7 SD 2001 Total Tax/Pack 0.10
8 SD 2001 Avg Cost/Pack 3.25

ETC...

欲望:

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

使用大约 10 个州和超过 200,000 个人的多个子措施的数据。

我的第一个想法是遍历附加到surveyrfame 的每一列,从位置和年份与当前indes 的位置和年份匹配的taxframe 中填写值,但这似乎效率低下。有没有更好的方法来用熊猫完成这件事?

谢谢

【问题讨论】:

  • 请提供预期的输出数据框。
  • 请提供足够的代码,以便其他人可以更好地理解或重现该问题。

标签: python pandas dataframe google-colaboratory


【解决方案1】:

您可以使用 pandas 来合并数据框。

import pandas as pd    

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

这应该做你想要的。此代码将执行左连接。还有其他联接类型:

how{‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, 默认‘inner’ 类型 要执行的合并。

left:仅使用左帧中的键,类似于 SQL 左外连接; 保留密钥顺序。

右:仅使用右框架中的键,类似于 SQL 右外部 加入;保留密钥顺序。

外部:使用来自两个帧的键并集,类似于 SQL 完整外部 加入;按字典顺序对键进行排序。

内部:使用来自两个帧的键的交集,类似于 SQL 内部联接;保留左键的顺序。

cross:从两个框架创建笛卡尔积,保留 左键的顺序。

另外 - 确保您用作键的标头在两个数据帧中相同(例如位置、年份)。否则,如果它们的名称不同,您可以使用 left_on 和 right_on。

【讨论】:

  • | |位置|年份|年龄|烟|子度量|价值| /n |-|-|-|-|-|-|-| /n |NY|2000|15|False|总税/包|50| /n |NY|2000|15|False|平均成本/包|5.50| /n |NY|2000|17|True|总税/包|50| /n |NY|2000|17|True|平均成本/包|5.50| /n 等... /n 它不是为每个单独的观察添加新列,而是为每个子度量克隆它们。这是因为 SubMeasure 列仍在使用中;我需要每条线上的所有子措施。 /n 谢谢
【解决方案2】:

制作如下。在函数 my_func 中有一个按“位置”、“年份”列分组。 x.values[0][0] 是位置,x.values0 是“年”。 根据“taxframe”数据框中的这些值进行选择。

接下来,从过滤后的数据中,我们得到“价值”,其中“总税/包”和“平均成本/包”。

我们通过 loc 替换值(loc 是行索引左侧的显式索引,右侧是列的名称)。在这里您可以阅读有关loc 的信息。

import pandas as pd
import numpy as np

Surveyframe = pd.read_csv('Surveyframe.csv', header=0)
taxframe = pd.read_csv('taxframe.csv', header=0)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-03-02
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多