我有两个pandas数据帧:key_df
和value_df
key_dict = {"coordinates": ["AB1", "AC1", "AD1", "EF1", ... ], "start": [762, 1274, 1587, 1991, ...], "end": [2481, 1789, 1689, 2211, ...] }
key_df = pd.DataFrame(key_dict)
coordinates start end
0 AB1 762 2481
1 AC1 1274 1789
2 AD1 1587 1689
3 EF1 1991 2211
... ... ... ...
value_dict = {"coordinates": ["AD1", "AB1"], "meta_data": [101, 010]}
value_df = pd.DataFrame(value_dict)
coordinates meta_data
0 AD1 101
1 AB1 110
... ... ...
coordinates
的{{1}}列仅包含唯一值 - 没有重复。同样适用于key_df
。
我想在value_df
上遍历value_df
,检查coordinates
中coordinates
的每个值,查看value_df
中coordinates
的值key_df
}。然后,我想为这些值返回start
和end
。
我想要对数据框进行子集并获取start
和end
值,就是创建一个函数:
def parse(x, df): ### 'x' is each row of value_df$coordinates
df = df[df.coordinates == x]
return (df.start, df.end) ## return as a tuple
我会将函数称为parse(x, df=key_df)
但是,我不确定如何迭代value_df
。 .iterrows()
很快但不保留行dtype,这可能是个问题。
答案 0 :(得分:1)
只需进行左连接就足够了
key_df = key_df.merge(value_df,on='coordinates',how='left')
另一种方法是根据坐标
重新索引value_dfvalue_df.index = value_df['coordinates']
common_values = set(key_df.coordinates).intersection(set(value_df.index))
value_df.loc[list(common_values),['start','end']]
答案 1 :(得分:0)
尝试以下:
key_df = pd.DataFrame(key_dict)
key_df.set_index('coordinates', inplace=True)
key_df.loc[value_dict['coordinates']]
答案 2 :(得分:0)
您可以通过内部联接执行此操作,并从结果数据框中获取开始和结束,如下所示:
result = pd.merge(key_df, value_df, on='coordinates', how='inner')