PythonPanda中:反转数据帧列值的最佳方法,其中col1>;可乐

PythonPanda中:反转数据帧列值的最佳方法,其中col1>;可乐,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个解决方案,但它使用for循环,我正在寻找一种更好/更优雅的方法,在Col1>Col2时交换Col1和Col2值 当前解决方案: 在2个for循环中: 查找Col1>Col2的行 然后添加行Col2 Col1分数 然后删除Col1>Col2的所有行。这只花了两行。 有没有更好的方法来交换Col1和Col2值 将熊猫作为pd导入 def drop_all_revd_in_df(df): indexNames=df[(df['col1']>df['col2'])。索引 drop(indexN

我有一个解决方案,但它使用for循环,我正在寻找一种更好/更优雅的方法,在Col1>Col2时交换Col1和Col2值

当前解决方案: 在2个for循环中: 查找Col1>Col2的行 然后添加行Col2 Col1分数 然后删除Col1>Col2的所有行。这只花了两行。 有没有更好的方法来交换Col1和Col2值


将熊猫作为pd导入
def drop_all_revd_in_df(df):
indexNames=df[(df['col1']>df['col2'])。索引
drop(indexNames,inplace=True)
返回df
#for循环检查col1>col2和反向顺序
def COL1GTCOL2清洁(df):
col1A_prev=“”
对于df['col1']中的col1A:
如果col1A!=col1A_prev:
col1A_prev=col1A
对于df[df['col1']==col1A]['col2']中的col1B:
如果(col1A>col1B):
分数=(df[(df['col1']==col1A)和(df['col2']==col1B)].score)。to_frame()['score'].iloc[0]
追加({'col1':col1B,'col2':col1A,'score':score},忽略_index=True)
df=在df(df)中删除所有
返回df
#初始化列表列表
dataShort=[“Andy”,“Claude”,15],
[“文森特”,“弗里达”,12],#不好
[“文森特”,“巴勃罗”,11]#不好
#创建数据帧
df=pd.DataFrame(dataShort,columns=['col1','col2','score'])
打印(df)
col1GTcol2CleanUp(df).对_值进行排序(['col1','col2'])。重置_索引(drop='True'))

这就是你要找的吗? “May”也可以通过lambda实现——为了简单起见,我将逻辑放在了一个单独的函数中

df = pd.DataFrame({'col1':['Andy','Vincent','Vincent'], 'col2':['Claude','Frida','Pablo'], 'score':[15,12,11]})
df
原始/输入数据帧:

实现所需o/p的代码:

def check_row(row):
    if row['col1'] > row['col2']:
        row['col1'],row['col2'] = row['col2'],row['col1'] 
        return row
    else:
        return row
df = df.apply(check_row, axis =1)
df
O/p:


这就是你要找的吗? “May”也可以通过lambda实现——为了简单起见,我将逻辑放在了一个单独的函数中

df = pd.DataFrame({'col1':['Andy','Vincent','Vincent'], 'col2':['Claude','Frida','Pablo'], 'score':[15,12,11]})
df
原始/输入数据帧:

实现所需o/p的代码:

def check_row(row):
    if row['col1'] > row['col2']:
        row['col1'],row['col2'] = row['col2'],row['col1'] 
        return row
    else:
        return row
df = df.apply(check_row, axis =1)
df
O/p:


根据直觉246的回答:Pandas.apply()方法往往速度较慢。这里还有另一种方法(下面代码中的method1),它的速度要快一点,但需要临时存储来存储一个额外的列。这也可以写在一行上(下面代码中的method2),甚至更快,但需要两列的临时存储

np.random.seed(113)
df = pd.DataFrame({'col1':np.random.randint(low=0, high=9, size=10000, dtype='int32'),
                   'col2':np.random.randint(low=0, high=9, size=10000, dtype='int32')})

def method1(df):
    """ Modifies df in place, no return value """
    df['col_tmp'] = df[['col1','col2']].max(axis=1)
    df['col1'] = df[['col1','col2']].min(axis=1)
    df['col2'] = df['col_tmp']
    del df['col_tmp']

def method2(df):
    """ Modifies df in place, no return value """
    df['col1'], df['col2'] = df[['col1','col2']].min(axis=1), df[['col1','col2']].max(axis=1)

# instinct246's answer

def check_row(row):
    if row['col1'] > row['col2']:
        row['col1'],row['col2'] = row['col2'],row['col1'] 
        return row
    else:
        return row

def method3(df):
    """ Returns modified df """
    return df.apply(check_row, axis =1)
运行
%%timeit
返回:

method1: 1.92 ms ± 62.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
method2: 1.31 ms ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
method3: 558 ms ± 8.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

下面是246:Pandas.apply()方法的答案,它的速度往往很慢。这里还有另一种方法(下面代码中的method1),它的速度要快一点,但需要临时存储来存储一个额外的列。这也可以写在一行上(下面代码中的method2),甚至更快,但需要两列的临时存储

np.random.seed(113)
df = pd.DataFrame({'col1':np.random.randint(low=0, high=9, size=10000, dtype='int32'),
                   'col2':np.random.randint(low=0, high=9, size=10000, dtype='int32')})

def method1(df):
    """ Modifies df in place, no return value """
    df['col_tmp'] = df[['col1','col2']].max(axis=1)
    df['col1'] = df[['col1','col2']].min(axis=1)
    df['col2'] = df['col_tmp']
    del df['col_tmp']

def method2(df):
    """ Modifies df in place, no return value """
    df['col1'], df['col2'] = df[['col1','col2']].min(axis=1), df[['col1','col2']].max(axis=1)

# instinct246's answer

def check_row(row):
    if row['col1'] > row['col2']:
        row['col1'],row['col2'] = row['col2'],row['col1'] 
        return row
    else:
        return row

def method3(df):
    """ Returns modified df """
    return df.apply(check_row, axis =1)
运行
%%timeit
返回:

method1: 1.92 ms ± 62.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
method2: 1.31 ms ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
method3: 558 ms ± 8.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


不要发布图片,使用文本发布代码和示例数据这是课程答案的一部分。我们被要求在任何地方共享代码作为图像。这不是得到最终答案所需要的,但是。。。我还应该发布代码吗?我已经有100%了。我在寻找更好的方法。如果不允许我们在学习时寻找更好的方法,我会感到失望。请解释为什么这个问题不好。全班同学让我们在StackOverflow中提问,我没有拿到零件
col1>col2
。你如何定义这一点?它是基于
str
的长度吗?col1和col2是字符串,它基于数据帧接受的大于的排序。然而,我正在寻找一个通用的答案,也可以是一个数字(比如一个id)。简单的交换是我除了for循环之外无法做到的,这似乎是一个非常不雅观且可能很慢的解决方案。不要发布图像,使用文本发布代码和样本数据这是课程答案的一部分。我们被要求在任何地方共享代码作为图像。这不是得到最终答案所需要的,但是。。。我还应该发布代码吗?我已经有100%了。我在寻找更好的方法。如果不允许我们在学习时寻找更好的方法,我会感到失望。请解释为什么这个问题不好。全班同学让我们在StackOverflow中提问,我没有拿到零件
col1>col2
。你如何定义这一点?它是基于
str
的长度吗?col1和col2是字符串,它基于数据帧接受的大于的排序。然而,我正在寻找一个通用的答案,也可以是一个数字(比如一个id)。简单的交换是我除了for循环之外无法做的事情,这似乎是一个非常不雅观且可能很慢的解决方案。谢谢。我猜不知道如何使用apply,也不知道第['N1'],第['N2']=第['N2'],第['N1']行可能是每个人都已经知道并且不应该问的事情=这是一个糟糕的问题?@traisen:肯定不是一个糟糕的问题:)可能,需要一些澄清,现在可以了。如果以上答案对您有效,请接受:)已接受。问题必须是可怕的得到-1或?但是我从上面提到的被接受的答案中学到了两个新的东西,所以很高兴我问了。@traisen:不用担心,我们都在这里学习。您现在编辑的问题(代码而不是代码的图像)有助于轻松复制/测试/复制输入数据/问题。我已经编辑了我的答案,以准确反映您现在的数据。谢谢,谢谢。我猜不知道如何使用apply,也不知道第['N1'],第['N2']=第['N2'],第['N1']行可能是每个人都已经知道并且不应该问的事情=这是一个糟糕的问题?@traisen:肯定不是一个糟糕的问题:)可能,需要一些澄清,现在可以了。如果以上答案对您有效,请接受:)已接受。问题必须是可怕的得到-1或?但是我从上面提到的被接受的答案中学到了两个新的东西,所以很高兴我问了。@traisen:不用担心,我们都在这里学习。您现在编辑的问题(代码而不是代码的图像)有助于复制/测试/复制输入数据/probl