我想执行从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
谢谢你,节日快乐!
答案 0 :(得分:3)
我选择map
,您也可以尝试merge
和join
,尝试查看索引,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
感谢您的讨论。
答案 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')
非常富有成果的讨论,节日快乐!