我有一个熊猫数据框,其中包含一个名称列表及其坐标:
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')