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