Python Pandas:添加索引与其他dataframe中匹配行的列

Python Pandas:添加索引与其他dataframe中匹配行的列,python,pandas,dataframe,Python,Pandas,Dataframe,正在清理sharepoint列表,以便使用正确的表关系上载到mssql 基本上,两个数据帧(data,config)都共享一些公共列(country,business)。 我想做的是在datadf中插入一个新列,其中每一行都包含configdf中匹配行的索引,该索引基于列country和business中的值 数据帧数据: -----|---------|----------|----- ... | Country | Business | ... -----|---------|------

正在清理sharepoint列表,以便使用正确的表关系上载到mssql

基本上,两个数据帧(data,config)都共享一些公共列(country,business)。 我想做的是在datadf中插入一个新列,其中每一行都包含configdf中匹配行的索引,该索引基于列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()是我尝试过的第一件事,但它们没有达到我的预期。谢谢,但这是我尝试过的第一件事之一,不会产生预期的结果。如果您执行上面的确切代码,则结果与您在问题中陈述的所需输出相同。你到底尝试了什么,它与你想要的有什么不同?谢谢,但这是我尝试的第一件事之一,没有给出预期的结果。如果你执行上面的确切代码,那么结果与你在问题中陈述的所需输出相同。你到底试过什么,和你想要的有什么不同?