【发布时间】:2021-10-16 22:26:41
【问题描述】:
编辑:我现在已经能够解决它
我想使用第二个数据帧聚合来自一个数据帧的观察结果,并且需要考虑权重和部分字符串匹配。
我制作了一个数据框,显示某类专利在一年内的申请频率,如下所示:
IPC_four count_year_IPC_four
Year
1955 A01B 9
1955 G01P 3
1955 B23D 4
1955 G01R 28
1955 B23C 1
... ... ...
1990 A21D 1
1990 G01F 17
1990 G06K 8
1990 F21P 0
1990 H05K 23
23868 rows × 2 columns
(我也有一个包含所有单个专利的数据框,但我使用pd.crosstab() 和pd.unstack() 以稍微不雅的方式汇总了该专利)
我想使用我的第二个表来聚合这些,这是一个从 IPC 类到行业分支的对应矩阵。 重要的是,由于某些 IPC 类别对应于多个经济部门,因此有一个“因素”列,需要将第一列的实例与该列相乘。
df2:
Branch Code Factor
0 20 E21 1.0
1 21 E01 1.0
2 21 E02 1.0
3 2 A21 1.0
4 2 A22 1.0
... ... ... ...
210 7 G10 1.0
211 7 A47B 1.0
212 7 A47C 1.0
213 7 A47D 1.0
214 7 A47F 1.0
215 rows × 3 columns
新的数据框应该是我来自 df1 的数字与相应的年份和行业分支的加权和。它应该如下所示:
Branch count_Branch_IPC_four
Year
1955 2 9
1955 3 3
1955 4 4
1955 5 28
1955 6 1
... ... ...
1990 2 1
1990 3 17
1990 4 8
1990 5 0
1990 6 23
576 rows x 3 columns
在下文中,我已经说明了我的思考过程,我认为这些步骤是填充我最终想要获得的数据框的一行所必需的:
-
由于所有内容都需要按年份汇总,因此我需要首先获得
df1[Year]的值(我认为?) -
我想查看我的第二个数据帧中的
df2[Branch],并考虑df2[Code]的哪些值对应于该分支。 -
然后我想取
df2[Code]中与df2[Branch]的值相对应的每个值,并检查df1[IPC_four]的哪些值(在给定的年份)适合这个。-
代码有时是三位数,有时是四位数。如果它只有三位数,我需要使用某种部分字符串匹配来检查它。
-
由于代码表示类和子类,与较长的代码相比,较短的代码只会选择更大的所有子类集合。因此,为什么我想做部分字符串匹配。如果这让我失望了,我也可以考虑添加额外的行,可能会有四位数的字符串排列,但这也不容易
-
-
对于每个合适的
df1[IPC_four],(可能不止一个)我想创建所有相应df1[count_year_IPC_four]值的总和。count_year_IPC_four的总和必须乘以Factor,这对应于我们一直在使用的Code。 (来自 DF2)。
当然,迭代有点令人困惑,但我最困惑的是如何通过本质上使用来自不同数据帧的行值来完成这些复杂的操作。
我尝试通过创建数据框字典,按年份和分支拆分数据框。
df = pd.read_pickle("count_year_IPCfour.pkl")
b = pd.read_pickle("branchlist.pkl")
branches = (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 21)
year_range = range(1955, 1990)
year_collection = {}
branch_collection = {}
for year in year_range:
new_df = df.loc[df['Year'] == year ]
year_collection[year] = pd.DataFrame(new_df, columns = [ "Branch", "IPC_four", "Code", "count_year_IPC_four", "Factor"])
for branch in branches:
new_df = b.loc[b['Branch'] == branch ]
branch_collection[branch] = pd.DataFrame(new_df, columns = [ "Branch", "IPC_four", "Code", "count_year_IPC_four", "Factor"])
但现在我仍然不知道该怎么做,因为从根本上说,我无法理解在沿行、跨列和跨数据帧移动方面所需的操作。
注意:由于重复(即一些IPC_four 代码属于多个Branch)和部分字符串匹配问题(一些Codes 是三位数,有些是四位数)我不能只是执行pd.join() 操作 - 我尝试过,但重复项意味着 df 增长了很多。
我应该如何实现这个?如果有人已经回答了这个问题,或者这可以分成多个部分,我很乐意看看这些。 非常感谢。
【问题讨论】:
标签: pandas dataframe aggregation matching