按另一个列表的顺序对齐三列数据帧



我有一个熊猫数据框,其中包含一个名称列表及其坐标:

name1 3 100
name2 5 4
name3 7 5
...
name88 100 300
name21 30 40

我还有另一个列表,它是一个单列系列,只有特定顺序的名称

name3
name10
name2
name6
...
name30

这两个数据帧具有相同的行数,但我需要对第一个数据帧重新排序,以便名称顺序与第二个数据框的顺序匹配。

我曾经有但无法实现的想法是使用 pandas groupby 函数,并使用它根据第二个数据帧对第一个数据帧进行分组。

但任何想法都会有所帮助。

假设数据帧中的名称列称为Name,其他系列称为names。那么这应该可以:

df = df.set_index('Name').reindex(index=names).reset_index()

一种方法是简单地对索引上的两个帧进行排序(假设索引是name,如果不是,则通过DataFrame.set_index将其设置为索引(

DataFrame.sort_index

另一种方法是简单地将这两个数据集连接到索引上(同样,假设name是索引(。

DataFrame.join

另一种方法是设置一个分类列并按该列排序:

假设两列都称为 names,并且您有 DF1 和 DF2

sorter = pd.Categorical(df1['name'], df2['names'])
df_sort = df1.assign(sort=sorter).sort_values('sort').drop('sort',axis=1)

使用DataFrame.merge

df2.merge(df1,on='name')

如果列的名称不同,则需要:

df2.merge(df1,left_on='df2_column_name',
right_on = 'df1_column_name').drop('df2_column_name',axis=1)

这是一个例子

print(df1)
df1_column_name   v1   v2
0              name1    3  100
1              name2    5    4
2              name3    7    5
3             name88  100  300
4             name21   30   40

print(df2)
df2_column_name
0              name3
1             name10
2              name2
3              name6
4             name30
5             name21
6             name88
7              name1
df2.merge(df1,left_on='df2_column_name',
right_on = 'df1_column_name').drop('df2_column_name',axis=1)
df1_column_name   v1   v2
0           name3    7    5
1           name2    5    4
2          name21   30   40
3          name88  100  300
4           name1    3  100

另一种方法是DataFrame.join

df2.join(df1.set_index('name_df1_column'),on = 'name_df2_column',how = 'right')

最新更新