熊猫映射2 dfs

时间:2017-12-22 18:35:48

标签: python pandas dataframe mapping

我想执行从df中的2个字段到另一个df1的映射。但是,df1的字段名称为空 DF:

Name1  Name2 Value
x      x-y      1
x      x-z      2
y      y-z      3
y      y-x      5
z      z-y      7

df1 :(是否可以为这个空插槽命名?)

      Num     
x     1
y     2
z     3
a     4
a-b   5
x-y   0
x-z   5
y-z   0
y-x   5
z-y   0

输出结果为:

Name1  Name2 Value  Num1   Num2
x      x-y      1     1     0
x      x-z      2     1     5
y      y-z      3     2     0
y      y-x      5     2     5
z      z-y      7     3     0

谢谢你,节日快乐!

4 个答案:

答案 0 :(得分:3)

我选择map,您也可以尝试mergejoin,尝试查看索引,merge应该是df1.merge(df2,left_on='Name1',right_index=True)

df['Num1']=df.Name1.map(df1.Num)
df['Num2']=df.Name2.map(df1.Num)
df
Out[1150]: 
  Name1 Name2  Value  Num1  Num2
0     x   x-y      1     1     0
1     x   x-z      2     1     5
2     y   y-z      3     2     0
3     y   y-x      5     2     5
4     z   z-y      7     3     0

另一种方式

df=df.set_index('Value').stack()
df.map(df1.Num)

pd.concat([df,df.map(df1.Num)],1).unstack()
Out[1169]: 
          0           1      
      Name1 Name2 Name1 Name2
Value                        
1         x   x-y     1     0
2         x   x-z     1     5
3         y   y-z     2     0
5         y   y-x     2     5
7         z   z-y     3     0

答案 1 :(得分:2)

选项1
您可以使用loc + values -

df.assign(
    Num1=df2.loc[df.Name1].values, Num2=df2.loc[df.Name2].values
)

  Name1 Name2  Value  Num1  Num2
0     x   x-y      1     1     0
1     x   x-z      2     1     5
2     y   y-z      3     2     0
3     y   y-x      5     2     5
4     z   z-y      7     3     0

选项2
loc + concat -

的另一个有趣替代方案
i = df2.loc[df.values[:, :2].ravel()].values
j = pd.DataFrame(i.reshape(len(df), -1), columns=['Num1', 'Num2'])

pd.concat([df, j], 1)


  Name1 Name2  Value  Num1  Num2
0     x   x-y      1     1     0
1     x   x-z      2     1     5
2     y   y-z      3     2     0
3     y   y-x      5     2     5
4     z   z-y      7     3     0

答案 2 :(得分:1)

仅仅为了提高可见性,将其从评论中删除:

      Num     
x     1
y     2
z     3
a     4
a-b   5
x-y   0
x-z   5
y-z   0
y-x   5
z-y   0

df1 = pd.read_clipboard()

输出:

     Num
x      1
y      2
z      3
a      4
a-b    5
x-y    0
x-z    5
y-z    0
y-x    5
z-y    0

字母列是索引。要重命名,必须使用 @cᴏʟᴅsᴘᴇᴇᴅ的解决方案:

df.index.name = 'name'

如果您尝试重命名索引,则它不起作用(使用或不使用inplace = True):

df1.rename(columns = {'': 'Name'}, inplace = True)
print(df1)

返回:

     Num
x      1
y      2
z      3
a      4
a-b    5
x-y    0
x-z    5
y-z    0
y-x    5
z-y    0

感谢您的讨论。

pandas rename index values

答案 3 :(得分:1)

已经给出了完美的答案,但我只是有一个注释。如果您还没有重命名未命名的列(称为索引),则发布的解决方案将完美运行。我将展示如何重命名,并在重命名后回答如何进行连接。

import pandas as pd
import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

# Create df
rawText = StringIO("""
Name1  Name2 Value
x      x-y      1
x      x-z      2
y      y-z      3
y      y-x      5
z      z-y      7
""")
df = pd.read_csv(rawText, sep = "\s+")

#Create df1 by renaming the unnamed index as Name3
rawText = StringIO("""
      Num     
x     1
y     2
z     3
a     4
a-b   5
x-y   0
x-z   5
y-z   0
y-x   5
z-y   0
""")
df1 = pd.read_csv(rawText, sep = "\s+")
df1 = df1.reset_index() # This works when you have multiple unnamed indices too
df1.rename(columns={'index':'Name3'}, inplace=True)

# Here is the solution
df.merge(df1, left_on='Name1', right_on='Name3')

非常富有成果的讨论,节日快乐!