Python 如何通过引用修改数据帧?
我正在尝试编写一个Python函数,该函数在适当的位置执行一个热编码,但是我很难找到在最后适当的位置执行concat操作的方法。它似乎为concat输出制作了我的数据帧的副本,我无法将其分配给我通过引用传递的数据帧 如何做到这一点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
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:太对了。