Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据ID和指向df2中列名称的值,从另一个数据帧(df2)中的列中获取值。蟒蛇/熊猫_Python_Pandas - Fatal编程技术网

Python 如何根据ID和指向df2中列名称的值,从另一个数据帧(df2)中的列中获取值。蟒蛇/熊猫

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

我有一个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       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都对提供的示例有效。它对我的工作任务不起作用,但对我的辅助活动起作用,因此感谢您提供了这个优雅的解决方案!