Python 熊猫:从匹配第一个元素的元组列表创建列

Python 熊猫:从匹配第一个元素的元组列表创建列,python,pandas,Python,Pandas,我有一个示例数据帧,如: cid pos 0 11 29 1 22 29 2 22 29 3 33 29 4 44 29 现在是元组列表,如: [(11, 3), (22, 1), (33, 4)

我有一个示例数据帧,如:

          cid             pos 
0         11              29      
1         22              29      
2         22              29      
3         33              29   
4         44              29  
现在是元组列表,如:

[(11, 3), (22, 1), (33, 4), (44, 4), (55, 7), (66, 2)]
我想从元组列表中创建另一列(第2个元素)。仅当df列中的第一个元素匹配时
cid

比如:


初学者在这里与熊猫,任何帮助将是伟大的!谢谢

我们可以从元组中创建第二个数据帧,然后使用panda的许多合并函数之一,我们可以从元组中获取第二个元素

让我们在此实例中使用
map

t = [(11, 3), (22, 1), (33, 4), (44, 4), (55, 7), (66, 2)]
df['new_pos'] = df['cid'].map(pd.DataFrame(t,columns=['cid','pos']).set_index('cid')['pos'])

   cid  pos  new_pos
0   11   29        3
1   22   29        1
2   22   29        1
3   33   29        4
4   44   29        4
分解这个

pd.DataFrame(t,columns=['cid','pos']).set_index('cid')['pos']
屈服

cid
11    3
22    1
33    4
44    4
55    7
66    2
Name: pos, dtype: int64

在列上使用
map
cid
中的实例从数据帧匹配到元组,并返回所选的列值,在此实例中,我将投票将tuokes列表放入第二个数据帧,然后进行左合并:

df1 = pd.DataFrame([{'cid': 11, 'pos': 29},
                    {'cid': 22, 'pos': 29},
                    {'cid': 22, 'pos': 29},
                    {'cid': 33, 'pos': 29},
                    {'cid': 44, 'pos': 29}])
df2 = pd.DataFrame([(11, 3), (22, 1), (33, 4), (44, 4),
                    (55, 7), (66, 2)], columns=['cid', 'new_pos'])

df3 = pd.merge(df1, df2, how='left', on='cid')
尝试:

输出:


您可以将元组列表转换为字典,并在上面使用
映射

b = [(11, 3), (22, 1), (33, 4), (44, 4), (55, 7), (66, 2)]
df["b"] = df["cid"].map(dict(b))

print(df)
   cid  pos  b
0   11   29  3
1   22   29  1
2   22   29  1
3   33   29  4
4   44   29  4

使用
df.merge(pd.DataFrame(lista,columns=[“cid”,“new_pos”]),on=“cid”)
我看不到新的列如果我有其他要保留的列怎么办?坏掉的部分会掉下来。这真的很干净+哇。这太棒了。地图上的一个小解释是用dict键映射cid?是的
map
将从序列中获取值(在本例中为df[“cid”]),然后将这些值与字典的键匹配,并从匹配的键返回值。
# Toy dataframe

df = pd.DataFrame({"cid":[11,22,22,33,44],"pos":[29,29,29,29,29]})

lista = [(11, 3), (22, 1), (33, 4), (44, 4), (55, 7), (66, 2)]

# Solution:

df.merge(pd.DataFrame(lista, columns = ["cid", "new_pos"]), on = "cid")
b = [(11, 3), (22, 1), (33, 4), (44, 4), (55, 7), (66, 2)]
df["b"] = df["cid"].map(dict(b))

print(df)
   cid  pos  b
0   11   29  3
1   22   29  1
2   22   29  1
3   33   29  4
4   44   29  4