Python 如何根据ID和指向df2中列名称的值,从另一个数据帧(df2)中的列中获取值。蟒蛇/熊猫
我有一个df1:Python 如何根据ID和指向df2中列名称的值,从另一个数据帧(df2)中的列中获取值。蟒蛇/熊猫,python,pandas,Python,Pandas,我有一个df1: ID State 1 AA 2 AA 3 ZF 3 CJ 和df2: ID AA ZF CJ etc 1 9 8 77 2 7 6 5 3 8 88 6 我必须在df1中创建一个新列,在df2中引入如下值: ID State Value 1 AA 9 2 AA 7 3 ZF
ID State
1 AA
2 AA
3 ZF
3 CJ
和df2:
ID AA ZF CJ etc
1 9 8 77
2 7 6 5
3 8 88 6
我必须在df1中创建一个新列,在df2中引入如下值:
ID State Value
1 AA 9
2 AA 7
3 ZF 88
3 CJ 6
我已经试了两个小时了,但似乎找不到一种方法根据df1['State']的值引用df2上的列名。即使我能想出一种方法来做到这一点,该值也是由ID过滤的。。。棘手的事情。有什么帮助吗
提前感谢您您可以在ID
和df1
上:
df1=df1.merge(df2.melt('ID',var\u name='State',value\u name='value'))
#ID状态值
#01 AA 9
#1 2 AA 7
#2 3 ZF 88
#3 CJ 6
这会更慢、更脆弱,但如果将
df2
的索引设置为ID
,则可以在apply()中使用loc[]
:
df2=df2.set_索引('ID'))
df1['Value']=df1.apply(lambda x:df2.loc[x.ID,x.State],axis=1)
让我们尝试以下方法:
将熊猫作为pd导入
df1=pd.DataFrame({'ID':{0:1,1:2,2:3,3:3},
'State':{0:'AA',1:'AA',
2:'ZF',3:'CJ'})
df2=pd.DataFrame({'ID':{0:1,1:2,2:3},
‘AA’:{0:9,1:7,2:8},
'ZF':{0:8,1:6,2:88},
‘CJ’:{0:77,1:5,2:6})
合并=df1.merge(
df2.set_索引('ID'))
.stack()
.reset_index()
.rename(列={'level_1':'State',0:'Value'}),
on=['ID','State']
)
打印(合并到字符串(索引=False))
合并
:
ID State Value
1 AA 9
2 AA 7
3 ZF 88
3 CJ 6
使用堆栈将df2
中的每个值获取到自己的行中:
print(df2.set_索引('ID'))
.stack()
.reset_index()
.rename(列={'level_1':'State',0:'Value'}))
输出:
ID State Value
0 1 AA 9
1 1 ZF 8
2 1 CJ 77
3 2 AA 7
4 2 ZF 6
5 2 CJ 5
6 3 AA 8
7 3 ZF 88
8 3 CJ 6
然后,这很容易与df1合并,因为您希望将第二个数据帧的列映射到第一个数据帧中的行,所以需要首先转置第二个数据帧,我还建议删除“ID”列以方便:
df2.drop('ID', axis = 1, inplace = True)
df2 = df2.T
df2.columns = ['State', 'Value1', 'Value2', 'Value3']
final_df = pd.merge(df1, df2, on = 'State', how = 'left')
这里有一个使用loc
df1['value'] = df2.set_index('ID').stack().loc[(pd.MultiIndex.from_frame(df1))].to_numpy()
这是一个非常酷的想法,但我尝试了我的df.head(10000)并且用了10分钟的时间运行了一个关键错误。最初的df有4kk,我不认为它对我的问题是可行的,但感谢您的洞察力,我相信它会派上用场。@Suetam016啊,是的,这对于较小的问题更像是一个快速技巧,但是apply(axis=1)
对于4M行来说并不好,这还假设df2
没有丢失任何ID
s或State
s@Suetam016使用melt
-merge
选项更新,对于4M行和缺少的键应该更好它确实有效,谢谢!现在唯一的问题是我的df1有400万行,合并后只有70万行,你知道为什么吗?默认合并是内部合并。因此,只有出现在两个数据帧中的值才会出现在合并后的中。您可能会看到不同的方式。我可以问一下为什么这里有“1级”?“返回具有多级索引的重塑数据帧或序列”。在本例中,“level_0”是“ID”列,“level_1”是“State”列,当调用reset_index
时,默认情况下该列的名称变为“level_1”,将其重命名为“State”只会简化合并条件。同样,使用值创建的新列将自动生成名称0
,并基于相同的原因重命名。非常感谢。我曾想过转换它,但我发现此方法的问题是,相同的状态根据ID具有不同的值。此代码是否会忽略这一点?df2也有600条生产线。。感谢您的帮助。我不确定在不指定状态的情况下,我是否遵循此操作。无论如何都尝试过,但得到:ValueError:无法处理非唯一的多索引!感谢您的回答我将其编辑为使用loc
,它可以处理非唯一索引,尽管我不确定这是否适用于您的实际数据。reindex和loc都对提供的示例有效。它对我的工作任务不起作用,但对我的辅助活动起作用,因此感谢您提供了这个优雅的解决方案!