Python 熊猫如何维持秩序?

Python 熊猫如何维持秩序?,python,pandas,Python,Pandas,我在pandas中有两个数据帧,试图合并它们。但是熊猫一直在改变顺序。我尝试过设置索引,重置它们,无论我做什么,我都无法使返回的输出中的行具有相同的顺序。有把戏吗? 请注意,我们从贷款订单“a,b,c”开始,但合并后是“a,c,b” 但现在的顺序不再是原来的“a,b,c”。有什么想法吗?我正在使用pandas版本11。希望有人能提供更好的答案,但如果没有人这样做,这肯定会奏效,所以 第零,我假设您不希望只在贷款上排序,而是保留x中的原始顺序,这可能与贷款列的顺序有关,也可能与此无关。(否则,问题

我在pandas中有两个数据帧,试图合并它们。但是熊猫一直在改变顺序。我尝试过设置索引,重置它们,无论我做什么,我都无法使返回的输出中的行具有相同的顺序。有把戏吗? 请注意,我们从贷款订单“a,b,c”开始,但合并后是“a,c,b”


但现在的顺序不再是原来的“a,b,c”。有什么想法吗?我正在使用pandas版本11。

希望有人能提供更好的答案,但如果没有人这样做,这肯定会奏效,所以

第零,我假设您不希望只在
贷款
上排序,而是保留
x
中的原始顺序,这可能与
贷款
列的顺序有关,也可能与此无关。(否则,问题更容易,也不那么有趣。)

首先,您要求它根据连接键进行排序。如前所述,当您不传递
sort
参数时,这是默认设置


其次,如果不根据连接键进行排序,则行最终将分组在一起,这样从同一源行合并的两行将彼此相邻,这意味着您仍将得到
a
c
b

您可以通过将行按它们在原始
x
中的显示顺序分组来解决此问题,只需再次与
x
合并(在任何一侧,这都不重要),或者根据
x
重新编制索引(如果您愿意)。像这样:

x.merge(x.merge(y, how='left', on='state', sort=False))

或者,您可以使用
reset\u index
在其中填充一个x索引,然后对其进行排序,如下所示:

x.reset_index().merge(y, how='left', on='state', sort=False).sort('index')


无论哪种方式显然都有点浪费和笨拙……所以,正如我所说的,希望有一个更好的答案,而我目前还没有看到。但如果没有,那就行。

希望有人能提供更好的答案,但如果没有人这样做,这肯定会起作用,所以

第零,我假设您不希望只在
贷款
上排序,而是保留
x
中的原始顺序,这可能与
贷款
列的顺序有关,也可能与此无关。(否则,问题更容易,也不那么有趣。)

首先,您要求它根据连接键进行排序。如前所述,当您不传递
sort
参数时,这是默认设置


其次,如果不根据连接键进行排序,则行最终将分组在一起,这样从同一源行合并的两行将彼此相邻,这意味着您仍将得到
a
c
b

您可以通过将行按它们在原始
x
中的显示顺序分组来解决此问题,只需再次与
x
合并(在任何一侧,这都不重要),或者根据
x
重新编制索引(如果您愿意)。像这样:

x.merge(x.merge(y, how='left', on='state', sort=False))

或者,您可以使用
reset\u index
在其中填充一个x索引,然后对其进行排序,如下所示:

x.reset_index().merge(y, how='left', on='state', sort=False).sort('index')


无论哪种方式显然都有点浪费和笨拙……所以,正如我所说的,希望有一个更好的答案,而我目前还没有看到。但如果没有,那就行了。

我发现的合并和恢复顺序的最快方法——如果您合并的是“左”数据框,则在合并前将原始顺序作为列包含在左数据框中,然后在合并后使用该列恢复顺序:

import pandas
loans = [  'a',  'b', 'c' ]
states = [  'OR',  'CA', 'OR' ]
x = pandas.DataFrame({ 'loan' : loans, 'state' : states })
y = pandas.DataFrame({ 'state' : [ 'CA', 'OR' ], 'value' : [ 1, 2]})

import numpy as np
x["Order"] = np.arange(len(x))

z = x.merge(y, how='left', on='state').set_index("Order").ix[np.arange(len(x)), :]
这种方法比排序快。这是一个函数:

def mergeLeftInOrder(x, y, on=None):
    x = x.copy()
    x["Order"] = np.arange(len(x))
    z = x.merge(y, how='left', on=on).set_index("Order").ix[np.arange(len(x)), :]
    return z

我发现的合并和恢复顺序的最快方法——如果要合并“left”——是在合并前将原始顺序作为列包含在left数据帧中,然后在合并后使用该列恢复顺序:

import pandas
loans = [  'a',  'b', 'c' ]
states = [  'OR',  'CA', 'OR' ]
x = pandas.DataFrame({ 'loan' : loans, 'state' : states })
y = pandas.DataFrame({ 'state' : [ 'CA', 'OR' ], 'value' : [ 1, 2]})

import numpy as np
x["Order"] = np.arange(len(x))

z = x.merge(y, how='left', on='state').set_index("Order").ix[np.arange(len(x)), :]
这种方法比排序快。这是一个函数:

def mergeLeftInOrder(x, y, on=None):
    x = x.copy()
    x["Order"] = np.arange(len(x))
    z = x.merge(y, how='left', on=on).set_index("Order").ix[np.arange(len(x)), :]
    return z
Pandas有一个函数,因此您的解决方案现在非常简单:

z = pd.merge_ordered(x, y, on='state')
Pandas有一个函数,因此您的解决方案现在非常简单:

z = pd.merge_ordered(x, y, on='state')
使用
pd.merge\u ordered()
,文档

以你为例,

z=pd.merge_顺序(x,y,how='left',on='state')

编辑:只是想指出此函数的默认行为是外部合并,不同于更常见的
.merge()

使用
pd.merge\u ordered()
,文档中的默认行为

以你为例,

z=pd.merge_顺序(x,y,how='left',on='state')


编辑:只是想指出此函数的默认行为是外部合并,不同于更常见的
的默认行为。merge()

我可能有一个更简单的解决方案:

df_z = df_x.join(df_y.set_index('state'), on = 'state')

希望它有帮助

我可能有一个更简单的解决方案:

df_z = df_x.join(df_y.set_index('state'), on = 'state')

希望它有帮助

首先,您需要传递
sort=False
,否则它将在join键上排序,这是您不想要的。但这还不足以解决问题;未排序的顺序仍然将来自同一源行的所有行组合在一起。一个简单的解决方法是执行
x.merge(x.merge(y,how='left',on='state',sort=False))
,它将
x
中的每一行与合并中相应的for合并,从而恢复
x
的原始顺序。但希望有一个更好的解决方案正在我的脑海中闪现。@abarnert,我认为我们可以使用
.join()
.update()
,它们(出于某种原因)确实保留了顺序。一方面,你需要传递
sort=False
,否则它会在连接键上排序,这是你不想要的。但这还不足以解决问题;未排序的顺序仍然将来自同一源行的所有行组合在一起。一个简单的解决方法是执行
x.merge(x.merge(y,how='left',on='state',sort=False))
,它将
x
中的每一行与合并中相应的for合并,从而恢复原始顺序o