我有以下数据框示例。
c1 c2
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
给定模板c1 = [3, 2, 5, 4, 1]
,我想根据列c1
的新顺序更改行的顺序,因此它看起来像:
c1 c2
0 3 c
1 2 b
2 5 e
3 4 d
4 1 a
我找到了以下线程,但随机播放是随机的。嗯。
答案 0 :(得分:5)
如果值在列表中以及c1
列中也是唯一的,请使用reindex
:
df = df.set_index('c1').reindex(c1).reset_index()
print (df)
c1 c2
0 3 c
1 2 b
2 5 e
3 4 d
4 1 a
使用列表和列中重复项的常规解决方案:
c1 = [3, 2, 5, 4, 1, 3, 2, 3]
#create df from list
list_df = pd.DataFrame({'c1':c1})
print (list_df)
c1
0 3
1 2
2 5
3 4
4 1
5 3
6 2
7 3
#helper column for count duplicates values
df['g'] = df.groupby('c1').cumcount()
list_df['g'] = list_df.groupby('c1').cumcount()
#merge together, create index from column and remove g column
df = list_df.merge(df).drop('g', axis=1)
print (df)
c1 c2
0 3 c
1 2 b
2 5 e
3 4 d
4 1 a
5 3 c
答案 1 :(得分:3)
merge
您可以使用按所需顺序指定的列创建数据框,然后按merge
。
这种方法的一个优点是,它可以优雅地处理df.c1
或列表c1
中的重复项。如果不希望重复,那么在重新订购之前必须小心处理。
d1 = pd.DataFrame({'c1': c1})
d1.merge(df)
c1 c2
0 3 c
1 2 b
2 5 e
3 4 d
4 1 a
searchsorted
这不太可靠,但是如果df.c1
为:
df.iloc[df.c1.searchsorted(c1)]
c1 c2
2 3 c
1 2 b
4 5 e
3 4 d
0 1 a