比较数据框中的每个值以创建新的数据框

时间:2019-08-18 13:38:28

标签: python pandas dataframe

  

尝试将一个数据帧的行中的每个值与   其他所有值

     

基于与前一行相关的if决定

> If value1 > value2: # in row_x
>     based_on_previous_value(value1)
  

引用row_x-1        然后尝试使用这些值df_new

构建新的数据框

示例)

df = pandas.DataFrame({"R1": [8,2], "R2": [-21,-24], "R3": [-9,46]})
# second row in df_new for (just a  simple example of a function for clarification reasons)

def based_on_previous_value(x):
    return x*2

df_new = pandas.DataFrame({"R1": [32,2], "R2": [-21,-24], "R3": [-18,46]})

> # 8 --> 32 (because 8 ist bigger than -21 & 8 is bigger than -9) --> 8*2*2 = 32
> # -21 --> -21 (because -21 is smaller than 8 & smaller than -9) --> -21 = -21
> # -9 --> -18 (because -9 is smaller than 8 & bigger than -21) --> -9*2 = 18

编辑:example2)

# I have a dataframe that Looks like this:
df = pandas.DataFrame({"R1": [8,2,3], "R2": [-21,-24,4], "R3": [-9,46,6],"R4": [16,-14,-1],"R5": [-3,36,76]})
  

如上所述:我想将一行中的每个值与每个值进行比较   其他,然后应用一个函数(如果x行中的值1较大,则   第x行中的值2)我正在尝试应用类似这样的内容:

If value1 in row1 > value2 in row 1:
    based_on_previous_value(value1) # trying to put results in a new dataframe
Else:
    return value1 # trying to put results in a new dataframe

def based_on_previous_value(x):
        x in row_before + 1
  

->此代码不起作用(只是试图显示我在代码中要执行的操作)

# results put in a new dataframe
df_new = pandas.DataFrame({"R1": [8,10,11], "R2": [-21,-21,-19], "R3": [-9,-5,-2],"R4": [16,17,17],"R5": [-3,0,4]})
  

->第二行中的“ R1”:2> -24,2> -14-> value(第一行中的“ R1”)+ 2 = 10   ->第二行中的“ R2”:-21 <所有其他4个值-> value(第一行中的“ R2”)+ 0 = -21   ->第二行中的“ R3”:46>所有其他4个值-> value(第一行中的“ R3”)+ 4 = -5

1 个答案:

答案 0 :(得分:1)

是的,所以您需要做几件事:

请参见,如果您按升序对列进行排序,则最小值将出现在开头,而最大值将出现在结尾。

由于这一点,我们可以将值乘以2的倍数,具体取决于它们在axis=1上的距离

因此,您的示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({"R1": [8,2], "R2": [-21,-24], "R3": [-9,46]})

如果我们这样排序:

val_sorted = np.sort(df.values,axis=1)

成为:

array([[-21,  -9,   8],
       [-24,   2,  46]], dtype=int64)

接下来,我们将根据值在列轴上的位置来创建乘法。

mult = [2**i for i in range(df.shape[1])]

然后我们可以将它们相乘:

sorted_mult = val_sorted*mult

输出:

array([[-21, -18,  32],
       [-24,   4, 184]], dtype=int64)

,如果要获取数据帧的初始顺序,请翻转值:

flipped_sorted_mult = np.fliplr(val_sorted)

输出:

array([[ 32, -18, -21],
       [184,   4, -24]], dtype=int64)

最后,我们将其放回数据框中:

df_final = pd.DataFrame(flipped_sorted_mult, columns = df.columns)

我认为这可能有点令人费解,但是每个步骤都应该明确。

现在,这是一种方法,它涉及较少的步骤,但可能更加隐秘:

df_sorted = df.apply(sorted,**{"reverse":True}, axis=1)
df_sorted = df_sorted.explode().values.reshape(df.shape)
df_final = pd.DataFrame(df_sorted*mult, columns=df.columns) 

发生了什么事?

我们将内置的sorted函数应用于每一行,并告诉apply方法将reverse参数传递为True

然后,我们返回一个熊猫系列,每行都被排序,不幸的是作为列表。因此,我使用了新的{pandas 0.25版本)explode方法来分解列表,最后将数组重新设置为初始形状。

最后一步与上面的步骤相似。

我希望这会有所帮助,

欢呼