【问题标题】:Sort dataframe by another on one column - pandas在一列上按另一个对数据框进行排序 - 熊猫
【发布时间】:2018-12-05 08:23:56
【问题描述】:

假设我要数据帧,如下所示:

df=pd.DataFrame({'a':[1,4,3,2],'b':[1,2,3,4]})
df2=pd.DataFrame({'a':[1,2,3,4],'b':[1,2,3,4],'c':[34,56,7,55]})

我想按'a' 列上的df2 数据的顺序对df 数据进行排序,因此df.a 列将是df2.a 的顺序,并且使整个数据框按顺序排列.

期望的输出:

   a  b
0  1  1
1  2  4
2  3  3
3  4  2

(手动制作,如有错误,请告诉我:D)

我自己的尝试:

df = df.set_index('a')
df = df.reindex(index=df2['a'])
df = df.reset_index()
print(df)

按预期工作!!!,

但是当我有更长的数据帧时,例如:

df=pd.DataFrame({'a':[1,4,3,2,3,4,5,3,5,6],'b':[1,2,3,4,5,5,5,6,6,7]})
df2=pd.DataFrame({'a':[1,2,3,4,3,4,5,6,4,5],'b':[1,2,4,3,4,5,6,7,4,3]})

它没有按预期工作。

注意:我不仅想要解释原因,而且我还需要一个解决方案来为大数据帧做这件事

【问题讨论】:

  • @coldspeed 编辑我的,将测试。
  • @coldspeed 抱歉,IndexError: positional indexers are out-of-bounds 出现错误,np.searchsorted 之一。我的版本是 0.19.2

标签: python python-3.x pandas sorting dataframe


【解决方案1】:

一种可能的解决方案是在两个DataFrames 中创建辅助列,因为重复值:

df['g'] = df.groupby('a').cumcount()
df2['g'] = df2.groupby('a').cumcount()

df = df.set_index(['a','g']).reindex(index=df2.set_index(['a','g']).index)
print(df)
       b
a g     
1 0  1.0
2 0  4.0
3 0  3.0
4 0  2.0
3 1  5.0
4 1  5.0
5 0  5.0
6 0  7.0
4 2  NaN
5 1  6.0

或者可能需要merge:

df3 = df.merge(df2[['a','g']], on=['a','g'])
print(df3)
   a  b  g
0  1  1  0
1  4  2  0
2  3  3  0
3  2  4  0
4  3  5  1
5  4  5  1
6  5  5  0
7  5  6  1
8  6  7  0

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 2016-03-24
    • 2015-11-06
    • 2019-04-12
    • 1970-01-01
    • 2023-04-04
    • 2016-10-13
    相关资源
    最近更新 更多