Python Pandas:添加索引与其他dataframe中匹配行的列
正在清理sharepoint列表,以便使用正确的表关系上载到mssql 基本上,两个数据帧(data,config)都共享一些公共列(country,business)。 我想做的是在datadf中插入一个新列,其中每一行都包含configdf中匹配行的索引,该索引基于列country和business中的值 数据帧数据:Python Pandas:添加索引与其他dataframe中匹配行的列,python,pandas,dataframe,Python,Pandas,Dataframe,正在清理sharepoint列表,以便使用正确的表关系上载到mssql 基本上,两个数据帧(data,config)都共享一些公共列(country,business)。 我想做的是在datadf中插入一个新列,其中每一行都包含configdf中匹配行的索引,该索引基于列country和business中的值 数据帧数据: -----|---------|----------|----- ... | Country | Business | ... -----|---------|------
-----|---------|----------|-----
... | Country | Business | ...
-----|---------|----------|-----
| A | 1 |
-----|---------|----------|-----
| A | 1 |
-----|---------|----------|-----
| A | 2 |
-----|---------|----------|-----
| A | 2 |
-----|---------|----------|-----
| B | 1 |
-----|---------|----------|-----
| B | 1 |
-----|---------|----------|-----
| B | 2 |
-----|---------|----------|-----
| C | 1 |
-----|---------|----------|-----
| C | 2 |
-----|---------|----------|-----
-----|---------|----------|-----------|-----
... | Country | Business | config_ID | ...
-----|---------|----------|-----------|-----
| A | 1 | 1 |
-----|---------|----------|-----------|-----
| A | 1 | 1 |
-----|---------|----------|-----------|-----
| A | 2 | 2 |
-----|---------|----------|-----------|-----
| A | 2 | 2 |
-----|---------|----------|-----------|-----
| B | 1 | 3 |
-----|---------|----------|-----------|-----
| B | 1 | 3 |
-----|---------|----------|-----------|-----
| B | 2 | 4 |
-----|---------|----------|-----------|-----
| C | 1 | 5 |
-----|---------|----------|-----------|-----
| C | 2 | 6 |
-----|---------|----------|-----------|-----
数据帧配置(ID=索引):
要添加到数据帧数据的内容:
-----|---------|----------|-----
... | Country | Business | ...
-----|---------|----------|-----
| A | 1 |
-----|---------|----------|-----
| A | 1 |
-----|---------|----------|-----
| A | 2 |
-----|---------|----------|-----
| A | 2 |
-----|---------|----------|-----
| B | 1 |
-----|---------|----------|-----
| B | 1 |
-----|---------|----------|-----
| B | 2 |
-----|---------|----------|-----
| C | 1 |
-----|---------|----------|-----
| C | 2 |
-----|---------|----------|-----
-----|---------|----------|-----------|-----
... | Country | Business | config_ID | ...
-----|---------|----------|-----------|-----
| A | 1 | 1 |
-----|---------|----------|-----------|-----
| A | 1 | 1 |
-----|---------|----------|-----------|-----
| A | 2 | 2 |
-----|---------|----------|-----------|-----
| A | 2 | 2 |
-----|---------|----------|-----------|-----
| B | 1 | 3 |
-----|---------|----------|-----------|-----
| B | 1 | 3 |
-----|---------|----------|-----------|-----
| B | 2 | 4 |
-----|---------|----------|-----------|-----
| C | 1 | 5 |
-----|---------|----------|-----------|-----
| C | 2 | 6 |
-----|---------|----------|-----------|-----
----找到了一些有用的东西----
它完成了任务,尽管我愿意接受其他建议,特别是如果它可以与df.insert()配合使用的话。您可以使用numpy.where函数来匹配数据帧 例如:
datadf = pd.DataFrame([['USA','Business1'],['AUS','Business2'],['UK','Business3'],['IND','Business4']],
columns=['country','business'])
configdf = pd.DataFrame([['AUS','Business2'],['IND','Business4'],['USA','Business1'],['UK','Business3']],
columns=['country','business'])
datadf['new_col'] = datadf.apply(lambda x: (np.where(x == configdf)[0][0]),axis=1)
print(datadf)
输出:
country business new_col
0 USA Business1 2
1 AUS Business2 0
2 UK Business3 3
3 IND Business4 1
EDIT1:
那么,在这种情况下,你可以使用
datadf['new_col'] = datadf.apply(lambda x: (np.where((x['country'] == configdf['country']) & (x['business'] == configdf['business']))[0][0]),axis=1)
基于示例数据帧datadf和configdf的输出:
country business new_col
0 A 1 0
1 A 1 0
2 A 2 1
3 A 2 1
4 B 1 2
5 B 1 2
6 B 2 3
7 C 1 4
8 C 2 5
可以使用numpy.where函数匹配数据帧 例如:
datadf = pd.DataFrame([['USA','Business1'],['AUS','Business2'],['UK','Business3'],['IND','Business4']],
columns=['country','business'])
configdf = pd.DataFrame([['AUS','Business2'],['IND','Business4'],['USA','Business1'],['UK','Business3']],
columns=['country','business'])
datadf['new_col'] = datadf.apply(lambda x: (np.where(x == configdf)[0][0]),axis=1)
print(datadf)
输出:
country business new_col
0 USA Business1 2
1 AUS Business2 0
2 UK Business3 3
3 IND Business4 1
EDIT1:
那么,在这种情况下,你可以使用
datadf['new_col'] = datadf.apply(lambda x: (np.where((x['country'] == configdf['country']) & (x['business'] == configdf['business']))[0][0]),axis=1)
基于示例数据帧datadf和configdf的输出:
country business new_col
0 A 1 0
1 A 1 0
2 A 2 1
3 A 2 1
4 B 1 2
5 B 1 2
6 B 2 3
7 C 1 4
8 C 2 5
下面是一个使用pandas merge的解决方案
下面是一个使用pandas merge的解决方案
我想你是在寻找一个连接操作:这是我的第一个猜测,但在浏览了文档之后,我不知道如何在这种情况下使其工作。我想你是在寻找一个连接操作:这是我的第一个猜测,但在浏览了文档之后,我不知道如何在这种情况下使其工作。。。它返回国家或企业匹配的行列表。虽然configdf中的国家/地区和业务集是唯一的,但国家/地区和业务条目本身并不是唯一的。添加了数据结构示例以供参考。@mrpilio同样应该可以,请参见上面的编辑1谢谢,最后使用了
datadf['config\u ID']=datadf.apply(lambda x:configdf[(configdf.country==x.country)&(configdf.business\u unit==x.business\u unit)]。索引[0],axis=1)
,但您的回答引导我找到了它。稍后将进行一些测试,看看一种解决方案是否比另一种解决方案有任何显著优势。我认为@julian的合并解决方案更好,除非您不关心重置索引。我关心从第二个df获取索引,这就是我需要的所有数据。merge()和join()是我尝试的第一件事,但它们并没有达到我的预期。关闭。。。它返回国家或企业匹配的行列表。虽然configdf中的国家/地区和业务集是唯一的,但国家/地区和业务条目本身并不是唯一的。添加了数据结构示例以供参考。@mrpilio同样应该可以,请参见上面的编辑1谢谢,最后使用了datadf['config\u ID']=datadf.apply(lambda x:configdf[(configdf.country==x.country)&(configdf.business\u unit==x.business\u unit)]。索引[0],axis=1)
,但您的回答引导我找到了它。稍后将进行一些测试,看看一种解决方案是否比另一种解决方案有任何显著优势。我认为@julian的合并解决方案更好,除非您不关心重置索引。我关心从第二个df获取索引,这就是我需要的所有数据。merge()和join()是我尝试过的第一件事,但它们没有达到我的预期。谢谢,但这是我尝试过的第一件事之一,不会产生预期的结果。如果您执行上面的确切代码,则结果与您在问题中陈述的所需输出相同。你到底尝试了什么,它与你想要的有什么不同?谢谢,但这是我尝试的第一件事之一,没有给出预期的结果。如果你执行上面的确切代码,那么结果与你在问题中陈述的所需输出相同。你到底试过什么,和你想要的有什么不同?