如何对DataFrame中满足条件的行的指定列子集进行排序?
搞定DataFrame指定行的列排序问题
我来帮你解决这个困扰啦!先理清楚你的需求:你有这样一个DataFrame:
a b c d e f g 0 x y 1 3 4 5 6 1 x y -1 7 8 5 6 2 x y -1 7 8 3 4
想要实现的是:只要行里的c列值等于-1,就把这一行的d到g列按升序重新排列,最终得到这样的结果:
a b c d e f g 0 x y 1 3 4 5 6 1 x y -1 5 6 7 8 2 x y -1 3 4 7 8
你之前试的两种方法没成功,我来帮你分析下原因:
- 第一种用
itertuples()遍历的方式:df.replace()是全局匹配值的,而且itertuples()返回的是只读元组,没法直接定位修改原DataFrame的对应行,所以根本改不动数据; - 第二种尝试用
df.loc定位,但没写对赋值的逻辑,所以也没生效。
给你两种靠谱的解决方案
方法一:用Pandas的apply(直观易懂)
这种写法逻辑清晰,适合小数据量场景:
import pandas as pd # 先构建你的DataFrame data = { 'a': ['x', 'x', 'x'], 'b': ['y', 'y', 'y'], 'c': [1, -1, -1], 'd': [3, 7, 7], 'e': [4, 8, 8], 'f': [5, 5, 3], 'g': [6, 6, 4] } df = pd.DataFrame(data) # 定义要排序的列范围 cols_to_sort = ['d', 'e', 'f', 'g'] # 核心逻辑:定位c=-1的行,对指定列按行排序后赋值回去 df.loc[df['c'] == -1, cols_to_sort] = df.loc[df['c'] == -1, cols_to_sort].apply( lambda row: sorted(row), axis=1, result_type='expand' ) print(df)
为啥这样能行?
df.loc[df['c'] == -1, cols_to_sort]精准锁定了需要修改的行和列,不会影响其他数据;apply(..., axis=1)是按行处理,每一行的d-g列会被sorted()排序成列表;result_type='expand'会把排序后的列表拆成对应列的数值,直接填回原DataFrame的位置。
方法二:用Numpy排序(性能更优)
如果你的DataFrame数据量很大,用Numpy的排序效率会更高:
import pandas as pd import numpy as np # 同样先构建DataFrame data = { 'a': ['x', 'x', 'x'], 'b': ['y', 'y', 'y'], 'c': [1, -1, -1], 'd': [3, 7, 7], 'e': [4, 8, 8], 'f': [5, 5, 3], 'g': [6, 6, 4] } df = pd.DataFrame(data) cols_to_sort = ['d', 'e', 'f', 'g'] # 先筛选出需要修改的行 mask = df['c'] == -1 # 直接用np.sort对选定的子DataFrame按行排序 df.loc[mask, cols_to_sort] = np.sort(df.loc[mask, cols_to_sort], axis=1) print(df)
这种方法利用Numpy的向量化操作,比apply循环快很多,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Florian Bernard
相关产品推荐
相关产品推荐

