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