我想进行特殊合并,但是我不确定如何在熊猫中进行合并。
我有以下 df1 :
CompanyName Country Ticker Revenue ....................
0 Apple Inc. US
1 Microsoft US MSFT 1235
2 Sony US
3 DBS SG D05 5523
4 Razer HK 0700.HK 2231
5 General Electric US GE 2131
6 Check Point L
7 Huawei CN
我有这个框架 tickersdf :
CompanyName Ticker Country
0 Apple Inc. AAPL.MX MX
1. Apple Inc. APC.DE DE
2. Apple Inc. APC.F F
3. Microsoft MSFT US
4. Sony SNE US
5 Razer 0700.HK HK
6. General Electric GE US
7. Sony 6758.T T
8. Microsoft MSFT.BA BA
9 General Motors. GM US
10. Check Point CHKP US
首先,我要合并CompanyName和Country作为键。
这将由一个简单的命令完成,
df1 = pd.merge(df1,tickersdf,on=['CompanyName','Country'], how='left')
因此缺少SNE的Sony将首先被填充。
CompanyName Country Ticker Revenue ....................
0 Apple Inc. US
1 Microsoft US MSFT 1235
2 Sony US SNE
3 DBS SG D05 5523
4 Razer HK 0700.HK 2231
5 General Electric US GE 2131
6 Check Point L
7 Huawei CN
如您所见, df1 缺少值,我想从 tickersdf 中获取值。
但是, tickersdf 具有相同公司名称的多个代码值。
如果您查看Apple Inc.,它没有可用的美国股票行情,但还有其他选择。
我想合并以下数据框,以便得到以下内容:
CompanyName Country Ticker Revenue ....................
0. Apple Inc. US hasalt
1 Apple Inc. MX AAPL.MX
2. Apple Inc. DE APC.DE
3. Apple Inc. F APC.F
4 Microsoft US MSFT 1235
5. Microsoft BA MSFT.BA
6 Sony US SNE
7. Sony T 6758.T
8 DBS SG D05 5523
9 Razer HK 0700.HK 2231
10 General Electric US GE 2131
11. Check Point L hasalt
12. Check Point US CHKP
13. Huawei CN
我不想触摸 df1 中已经包含代码的行。
在此示例中,对于诸如Apple Inc.和Check Point之类的公司,股票报价器在美国或L中不可用,但是它有其他选择。因此,我希望股票行情栏部分说“ hasalt”或留空,我希望将替代项复制到df1中。
Microsoft和Sony已经在 df1 中填充了MSFT和SNE,但是有其他可用的替代方法,因此我希望也可以将其选中并复制到 df1 中。
如果 df1 中不存在公司名称,则我不想添加该公司名称,就像通用汽车不在 df1 中一样,所以我不希望被带走。
像华为这样的公司在 tickersdf 中根本没有匹配项,因此我希望将其留空。
这可以用熊猫吗?如果可以,怎么办?
我正在考虑这样做
df1['Ticker'] = df1['Ticker'].fillna(df1['CompanyName'].map(tickersdf.set_index('CompanyName')['Ticker']))
但是 tickersdf 有重复项,所以我也考虑了合并或联接,但是我认为不能这样做,因为 tickersdf 中的条目不在 df1 中将出现在 df1 中。
我知道我可以使用此方法过滤掉其他选择
tickersdf[(tickersdf['CompanyName'].str.contains('Check Point'))]
但是如何根据我的情况将行复制到df1中?
我认为它看起来像
if df1['CompanyName'] is in tickersdf['CompanyName'],
then set df1['Ticker'] = 'hasalt'
followed by tickersdf[(tickersdf['CompanyName'].str.contains(df1['CompanyName']))]
and copying all the alternatives over to df1.
else ignore
执行此操作的正确方法是什么?可以用某种特殊填充来完成吗?
答案 0 :(得分:1)
我认为您需要的是两个数据帧的外部合并(另请参见this excellent post about merging)
df2 = pd.merge(df1,tickersdf,on=['CompanyName','Country'], how='outer', sort=True)
为了满足您的条件,进行了一些后期处理-首先删除df1
中不存在的公司:
df2 = df2.drop(df2[~df2.CompanyName.isin(df1.CompanyName.values)].index).reset_index(drop=True)
请注意,我已将合并结果分配给另一个数据框df2
,因此您仍然可以在此步骤中访问原始数据框df1
。
最后,根据Ticker
和Ticker_x
创建一个新的Ticker_y
列:
df2['Ticker'] = df2.apply (lambda r: r.Ticker_y if pd.isnull(r.Ticker_x) or r.Ticker_x == '' else r.Ticker_x, axis=1)
答案 1 :(得分:1)