python - 用列名匹配两个 df 和 tag
问题描述
df1
1A 1B 1C
a1 b1 c1
a2 b2 c2
a3 b3 c4
df2
ID
a1
b1
c4
a3
我想用 df 匹配的列名标记 df2 中的每一行。
期望的输出
ID ID_name
a1 1A
b1 1B
c4 1C
a3 1A
a8 NaN
这些是我的代码,它做我想要的,
save_p = []
for ix,row1 in df2.iterrows():
for ix2, row2 in df1.iterrows():
if row1.1A == row2.ID:
save_p.append((row2.ID,'1A'))
if row1.1B == row2.ID:
save_p.append((row2.ID,'1B'))
if row1.1C == row2.ID:
save_p.append((row2.ID,'1C'))
........等等,但我想要一些最好/优雅的方式来做?谢谢。
解决方案
使用Series.map
with DataFrame.melt
,如果没有匹配得到像 一样的缺失值c3
,因为 no in df1
:
s = df1.melt().set_index('value')['variable']
#if possible duplicates remove them
#s = df1.melt().drop_duplicates('value').set_index('value')['variable']
df2['ID_name'] = df2['ID'].map(s)
print (df2)
ID ID_name
0 a1 1A
1 b1 1B
2 c4 1C
3 c3 NaN
详情:
print (df1.melt())
variable value
0 1A a1
1 1A a2
2 1A a3
3 1B b1
4 1B b2
5 1B b3
6 1C c1
7 1C c2
8 1C c4
推荐阅读
- r - 包 withr 不可用(R 版本 4.0.2)
- capacitor - Ionic 5 + 带有华为 HMS 的电容器
- r - 在 R 中排列行,以使年份列按自定义顺序排列,并将具有相同条目的其他列分组
- machine-learning - 通过多重预处理点燃 ML
- c# - 测试项目不引用任何 .NET Nuget 适配器
- python - 如果 A 行中的字符串包含 B 行元素,则 Pandas 过滤器
- mysql - 如何在 MySQL 中查找重复记录,但有一定程度的差异?
- java - Java GroupBy 多个与 Sum
- machine-learning - 模型没有学习:自定义激活函数和/或自定义损失函数的问题
- cassandra - 基于节点的用例的 cassandra 数据建模