python - 连接/合并两个 Pandas 数据框。将一个的级别与另一个的索引相匹配

标签 python join pandas merge dataframe

我正在尝试加入两个 pandas 数据框;左边的有一个多索引,右边的只是一个普通的数据框。我想将右侧数据帧的索引加入到左侧数据帧的某一级别上。例如,如果我们有以下示例:

           Age
Boys          
      Sam   21
      John  22
Girls         
      Lisa  23

      Points
John       1
Lisa       2
Sam        3

我想以这样的方式结束:

           Age Points
Boys                 
      Sam   21      3
      John  22      1
Girls                
      Lisa  23      2

我的解决方法如下,我只是想知道是否有更直接的方法

In[2]: import pandas as pd
In[3]: idx = pd.MultiIndex(levels=[['Boys', 'Girls', ''],['Sam', 'John', 'Lisa', '']], labels=[[0,2,2,1,2],[3,0,1,3,2]])
df1 = pd.DataFrame({'Age':['',21,22,'',23]}, index=idx)
df2 = pd.DataFrame({'Points':[1, 2, 3]}, index=['John','Lisa','Sam'])

In[4]: df1
Out[4]: 
           Age
Boys          
      Sam   21
      John  22
Girls         
      Lisa  23

In[5]: df2
Out[5]: 
      Points
John       1
Lisa       2
Sam        3

然后我编写了这个循环,通过给它一个多索引和适当重新排列的值来“转换”正确的数据帧

lvl = df1.index.levels[1]
lbl = df1.index.labels[1]
y = df2.iloc[:,0].values.tolist()
z=[]
for x in [lvl[k] for k in lbl]:
    try:
        idx = df2.index.tolist().index(x)
    except ValueError as e:
        z.append('')
    else:
        z.append(y[idx])

temp=pd.DataFrame(index=df1.index)
temp['Points'] = z

我现在可以加入他们

out = df1.join(temp)
out
Out[6]: 
           Age Points
Boys                 
      Sam   21      3
      John  22      1
Girls                
      Lisa  23      2

最佳答案

为您的索引命名 - 它将帮助 Pandas 了解如何加入您的数据框:

In [72]: df1
Out[72]:
           Age
sex   name
Boys
      Sam   21
      John  22
Girls
      Lisa  23

In [73]: df1.index.names=['sex','name']

In [74]: df2.index.name = 'name'

现在加入变得非常容易:

In [75]: df1.join(df2)
Out[75]:
           Age  Points
sex   name
Boys               NaN
      Sam   21       3
      John  22       1
Girls              NaN
      Lisa  23       2

PS NaN - 是空行的结果

关于python - 连接/合并两个 Pandas 数据框。将一个的级别与另一个的索引相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283029/

相关文章:

python - 从 Pandas 到excel的颜色格式

C++ 嵌入式 Python :pass Tuple declared in C++ to a method of a python class

mysql - 慢 SQL INNER JOIN

python - 如何表示 Pandas DataFrame 中缺失的数据?

python - pandas DataFrame 添加 fill_value NotImplementedError

python - 从 Flask 运行 Scrapy

python - HttpRequest实例在Django中动态添加属性?

SQLite:带有内连接的复杂更新语句

sql - 使用子查询和连接

python - 将 pandas 列中的字典转换为数据框