Python 使用列中的值和ID连接索引
我有两个数据帧:Python 使用列中的值和ID连接索引,python,pandas,Python,Pandas,我有两个数据帧: targets = {'index':[3, 4, 5], 'sequence_id':[140366A0464161, 140366A0464178, 140366A0464189], 'target': [0, 1, 0]} data = {'sequence_id':[140366A0464161, 140366A0464161, 140366A0464161, 140366A0464178, 140366A0464178, 14036
targets = {'index':[3, 4, 5],
'sequence_id':[140366A0464161, 140366A0464178, 140366A0464189],
'target': [0, 1, 0]}
data = {'sequence_id':[140366A0464161, 140366A0464161, 140366A0464161, 140366A0464178, 140366A0464178, 140366A0464178, 140366A0464178, 140366A0464178],
'feature_1' : ['true', 'true', 'false', 'false', 'true', 'true', 'false', 'false']}
我想创建另一个数据帧,其中目标
中的索引
和序列id
列对应于数据
中的序列id
的索引
我的意思是,例如,
140366A0464161
的第三个索引将是false
,目标为0
。索引可能并不总是eachsequence\u id
的最后一个实例。数据中的功能也比功能\u 1
多
我的预期产出是:
index sequence_id feature_1 target
0 3 140366A0464161 false 0
1 4 140366A0464178 false 0
2 5 140366A0464189 true 0
就我所尝试的内容而言:我尝试了基于序列id
的连接,但意识到它远不止于此,因为数据中的索引不是真实的,所以这让我很困惑
提前感谢。我相信您需要使用left join:
t = pd.DataFrame(targets)
df = pd.DataFrame(data)
#convert column to boolean
df['feature_1'] = df['feature_1'].map({'true':True, 'false':False})
#merge by index column with left join and replace missing values by `False`
df = (t.merge(df.reset_index(), on=['index','sequence_id'], how='left')
.fillna({'feature_1':False}))
print (df)
index sequence_id target feature_1
0 3 140366A0464161 0 False
1 4 140366A0464178 1 True
2 5 140366A0464189 0 False
详细信息:
print (t.merge(df.reset_index(), on=['index','sequence_id'], how='left'))
index sequence_id target feature_1
0 3 140366A0464161 0 NaN
1 4 140366A0464178 1 True
2 5 140366A0464189 0 NaN
我相信您需要与left join一起:
t = pd.DataFrame(targets)
df = pd.DataFrame(data)
#convert column to boolean
df['feature_1'] = df['feature_1'].map({'true':True, 'false':False})
#merge by index column with left join and replace missing values by `False`
df = (t.merge(df.reset_index(), on=['index','sequence_id'], how='left')
.fillna({'feature_1':False}))
print (df)
index sequence_id target feature_1
0 3 140366A0464161 0 False
1 4 140366A0464178 1 True
2 5 140366A0464189 0 False
详细信息:
print (t.merge(df.reset_index(), on=['index','sequence_id'], how='left'))
index sequence_id target feature_1
0 3 140366A0464161 0 NaN
1 4 140366A0464178 1 True
2 5 140366A0464189 0 NaN
据我所知,您希望为每个sequence_id取最后一个值,因为在“data”数据帧中有几个相同的sequence_id(如果您提供有关所需连接逻辑的附加信息,可能是另一种解决方案)
因此,第一步-将其转换为适当的格式:
df1 = pd.DataFrame.from_dict(targets).set_index('index')
df2 = pd.DataFrame.from_dict(data).set_index('sequence_id')
conv_df = df2.groupby('sequence_id').nth([-1])
Out[80]:
feature_1
sequence_id
140366A0464161 false
140366A0464178 false
那么,就这样吧:
df1.merge(conv_df, left_on = 'sequence_id', right_index = True)
Out[83]:
sequence_id target feature_1
index
3 140366A0464161 0 false
4 140366A0464178 1 false
据我所知,您希望为每个sequence_id取最后一个值,因为在“data”数据帧中有几个相同的sequence_id(如果您提供有关所需连接逻辑的附加信息,可能是另一种解决方案)
因此,第一步-将其转换为适当的格式:
df1 = pd.DataFrame.from_dict(targets).set_index('index')
df2 = pd.DataFrame.from_dict(data).set_index('sequence_id')
conv_df = df2.groupby('sequence_id').nth([-1])
Out[80]:
feature_1
sequence_id
140366A0464161 false
140366A0464178 false
那么,就这样吧:
df1.merge(conv_df, left_on = 'sequence_id', right_index = True)
Out[83]:
sequence_id target feature_1
index
3 140366A0464161 0 false
4 140366A0464178 1 false
这会将错误的目标附加到每一行,因为您已指定target=0。目标应该来自目标框架。此外,可能有更多的功能,而不仅仅是功能。\u 1。应该已经澄清:)这会将错误的目标附加到每一行,因为您分配了target=0。目标应该来自目标框架。此外,可能有更多的功能,而不仅仅是功能。\u 1。应该澄清:)索引可能并不总是每个序列id的最后一个实例。我将编辑帖子来描述这一点。索引可能并不总是每个序列id的最后一个实例。我将编辑帖子来描述这一点。