如何基于迭代另一个df的所有行值来对pandas数据帧进行子集化?

时间:2017-12-13 06:38:34

标签: python pandas csv

我有两个pandas数据帧:key_dfvalue_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,检查coordinatescoordinates的每个值,查看value_dfcoordinates的值key_df }。然后,我想为这些值返回startend

我想要对数据框进行子集并获取startend值,就是创建一个函数:

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,这可能是个问题。

3 个答案:

答案 0 :(得分:1)

只需进行左连接就足够了

key_df = key_df.merge(value_df,on='coordinates',how='left')

另一种方法是根据坐标

重新索引value_df
value_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')