Python 如何通过引用修改数据帧?

Python 如何通过引用修改数据帧?,python,pandas,data-science,Python,Pandas,Data Science,我正在尝试编写一个Python函数,该函数在适当的位置执行一个热编码,但是我很难找到在最后适当的位置执行concat操作的方法。它似乎为concat输出制作了我的数据帧的副本,我无法将其分配给我通过引用传递的数据帧 如何做到这一点 def one_hot_encode(df, col: str): """One-Hot encode inplace. Includes NAN. Keyword arguments: df (DataFrame) -- the Da

我正在尝试编写一个Python函数,该函数在适当的位置执行一个热编码,但是我很难找到在最后适当的位置执行concat操作的方法。它似乎为concat输出制作了我的数据帧的副本,我无法将其分配给我通过引用传递的数据帧

如何做到这一点

def one_hot_encode(df, col: str):
     """One-Hot encode inplace. Includes NAN.

     Keyword arguments:
     df (DataFrame) -- the DataFrame object to modify
     col (str) -- the column name to encode
     """

     insert_loc = df.columns.get_loc(col)
     insert_data = pd.get_dummies(df[col], prefix=col + '_', dummy_na=True)

     df.drop(col, axis=1, inplace=True)
     df[:] = pd.concat([df.iloc[:, :insert_loc], insert_data, df.iloc[:, insert_loc:]], axis=1) # Doesn't take effect outside function

要使更改在函数外部生效,我们必须更改传入的对象,而不是用新对象替换其名称(在函数内部)

要分配新列,可以使用

df[insert_data.columns]=插入_数据

而不是海螺

不过,这并没有利用您谨慎的插入订单。 为了保留您的订单,我们可以重新索引数据帧

df.reindex(列=列)

其中cols是按顺序排列的列的组合列表:

cols=[cols[:insert_loc]+list(insert_data.columns)+cols[insert_loc:]

总而言之

import pandas as pd

def one_hot_encode(df, col: str):
    """One-Hot encode inplace. Includes NAN.

    Keyword arguments:
    df (DataFrame) -- the DataFrame object to modify
    col (str) -- the column name to encode
    """

    cols = list(df.columns)
    insert_loc = df.columns.get_loc(col)
    insert_data = pd.get_dummies(df[col], prefix=col + '_', dummy_na=True)

    cols = [cols[:insert_loc] + list(insert_data.columns) + cols[insert_loc:]]
    df[insert_data.columns] = insert_data
    df.reindex(columns=cols)
    df.drop(col, axis=1, inplace=True)


import seaborn

diamonds=seaborn.load_dataset("diamonds")
col="color"
one_hot_encode(diamonds, "color")

assert( "color" not in diamonds.columns ) 
assert( len([c for c in diamonds.columns if c.startswith("color")]) == 8 )


我认为在python中不能通过引用传递函数参数(请参阅:)

相反,您可以做的只是从函数返回修改后的
df
,并将结果分配给原始
df

def one_hot_encode(df,col:str):
...
返回df
...
df=一个热编码(df,col)
df.insert已就位,但一次只能插入一列。这可能不值得重新订购

def one_hot_encode2(df, col: str):
    """One-Hot encode inplace. Includes NAN.

    Keyword arguments:
    df (DataFrame) -- the DataFrame object to modify
    col (str) -- the column name to encode
    """

    cols = list(df.columns)
    insert_loc = df.columns.get_loc(col)
    insert_data = pd.get_dummies(df[col], prefix=col + '_', dummy_na=True)

    for offset, newcol in enumerate(insert_data.columns):
        df.insert(loc=insert_loc+offset, column=newcol, value = insert_data[[newcol]])

    df.drop(col, axis=1, inplace=True)


import seaborn

diamonds=seaborn.load_dataset("diamonds")
col="color"
one_hot_encode2(diamonds, "color")

assert( "color" not in diamonds.columns ) 
assert(len([c for c in diamonds.columns if c.startswith("color")]) == 8)

assert([(i) for i,c in enumerate(diamonds.columns) if c.startswith("color")][0] == 2)

函数的变量范围仅在该函数内。只需在函数的末尾包含一个return语句,即可将修改后的数据帧作为输出。调用此函数将返回修改后的数据帧。另外,在分配新(虚拟)列时,在更改原始数据帧的维度时,使用df代替df[:]

def one_hot_encode(df, col: str):
    insert_loc = df.columns.get_loc(col)
    insert_data = pd.get_dummies(df[col], prefix=col + '_', dummy_na=True) 
    df.drop(col, axis=1, inplace=True)
    df = pd.concat([df.iloc[:, :insert_loc], insert_data, df.iloc[:, insert_loc:]], axis=1) 
    return df
现在要查看修改后的数据帧,请调用函数并将其分配给新的/现有的数据帧,如下所示

df=one_hot_encode(df,'<any column name>')
df=one\u hot\u编码(df,”)

reindex未就位,因此订单不会在function@JoshK:太对了。