合并具有不同结构的表
merging tables with different structures
我有两个 table,我想在其中找到基于 Ticker 变量的外部连接。
在Table I中,每个实体(基金)我只有一个 Ticker,但在table II中,我可能有多个记录(每个“FundID”的多个代码)。目标是计算独特的资金。
我想要table III,它是tables I和II在基金层面的组合。如果一个 Ticker 在两个 table 中都存在,则在 table III 中被视为一条记录。如果代码存在于 table II 但不存在于 table I,我希望它存在于 table III.
但是,我不想要来自同一基金(“FundID”)的另一个代码。在这种情况下,我们可能会从每个基金组中随机选择一个代表 Ticker(同样,它们将具有相同的“FundID”),因此我们不会为一个特定基金提供多个 Ticker。
Table 1:
Ticker
A
B
C
D
Table二:
Ticker
FundID
A
1
AA
1
AB
1
B
2
BB
2
E
3
EB
3
EC
3
Table三(合并):
Ticker
A
B
C
D
E
您可以尝试使用 merge
然后使用 duplicated
通过过滤器
out = t1.merge(t2,how='outer')
out = out[~out['FundID'].duplicated() | out['FundID'].isna()]
Out[87]:
Ticker FundID
0 A 1.0
1 B 2.0
2 C NaN
3 D NaN
7 E 3.0
您可以先过滤 df2
行,其中对于每个 FundID,其对应“Ticker”的 none 在 df1['Ticket']
中。然后在这些 FundID 中,为每个 FundID 采样一个 Ticker 并将其连接到 df1
:
sub_df2 = df2[~df2['Ticker'].isin(df1['Ticket']).groupby(df2['FundID']).cummax()]
out = pd.concat((df1, sub_df2.groupby('FundID')['Ticker'].sample(n=1).to_frame().rename(columns={'Ticker':'Ticket'})))
输出:
Ticket
0 A
1 B
2 C
3 D
5 E
我有两个 table,我想在其中找到基于 Ticker 变量的外部连接。
在Table I中,每个实体(基金)我只有一个 Ticker,但在table II中,我可能有多个记录(每个“FundID”的多个代码)。目标是计算独特的资金。
我想要table III,它是tables I和II在基金层面的组合。如果一个 Ticker 在两个 table 中都存在,则在 table III 中被视为一条记录。如果代码存在于 table II 但不存在于 table I,我希望它存在于 table III.
但是,我不想要来自同一基金(“FundID”)的另一个代码。在这种情况下,我们可能会从每个基金组中随机选择一个代表 Ticker(同样,它们将具有相同的“FundID”),因此我们不会为一个特定基金提供多个 Ticker。
Table 1:
Ticker |
---|
A |
B |
C |
D |
Table二:
Ticker | FundID |
---|---|
A | 1 |
AA | 1 |
AB | 1 |
B | 2 |
BB | 2 |
E | 3 |
EB | 3 |
EC | 3 |
Table三(合并):
Ticker |
---|
A |
B |
C |
D |
E |
您可以尝试使用 merge
然后使用 duplicated
out = t1.merge(t2,how='outer')
out = out[~out['FundID'].duplicated() | out['FundID'].isna()]
Out[87]:
Ticker FundID
0 A 1.0
1 B 2.0
2 C NaN
3 D NaN
7 E 3.0
您可以先过滤 df2
行,其中对于每个 FundID,其对应“Ticker”的 none 在 df1['Ticket']
中。然后在这些 FundID 中,为每个 FundID 采样一个 Ticker 并将其连接到 df1
:
sub_df2 = df2[~df2['Ticker'].isin(df1['Ticket']).groupby(df2['FundID']).cummax()]
out = pd.concat((df1, sub_df2.groupby('FundID')['Ticker'].sample(n=1).to_frame().rename(columns={'Ticker':'Ticket'})))
输出:
Ticket
0 A
1 B
2 C
3 D
5 E