Pandas Dataframe函数未正确调用

kb5ga3dv  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(131)

我有两个dataframe,我正在将float值转换为字符串作为vlookup过程的一部分。下面是我的两个dataframe表布局:
DF:
| 项目编号|项目描述|项目分类|物料分类说明|
| --------------|--------------|--------------|--------------|
| ABC123|钻石|零零零一|宝石|
| ABC456|蓝宝石|零零零一|宝石|
| DEF000|硅|小零零零二|矿物|
DF2:
| 项目分类|物料分类说明|
| --------------|--------------|
| 零零零一|宝石|
| 小零零零二|矿物|
我能够通过执行以下操作正确地格式化Item Class值(值以float形式导入,并有一些NaN):

df['Item Class']=df['Item Class'].fillna(value=0,inplace=False)
df['Item Class']=df['Item Class'].astype(int,copy=True,errors='raise')
df['Item Class']=df['Item Class'].astype(str,copy=True,errors='raise')
df['Item Class']=df['Item Class'].apply('{:0>4}'.format)

df2['Item Class']=df2['Item Class'].fillna(value=0,inplace=False)
df2['Item Class']=df2['Item Class'].astype(int,copy=True,errors='raise')
df2['Item Class']=df2['Item Class'].astype(str,copy=True,errors='raise')
df2['Item Class']=df2['Item Class'].apply('{:0>4}'.format)

我试着创建一个函数来压缩这个:

def float_to_str(df_column):
     df_column=df_column.fillna(value=0,inplace=False)
     df_column=df_column.astype(int,copy=True,errors='raise')
     df_column=df_column.astype(str,copy=True,errors='raise')
     df_column=df_column.apply('{:0>4}'.format)

但是当我用

float_to_str(df['Item Class'])

float_to_str(df2['Item Class'])

而不是格式化项目类值,值没有被转换,我要么得到错误消息ValueError: You are trying to merge on float64 and object columns. If you wish to proceed you should use pd.concat,要么df 2值被保留为float,这表明在这两种情况下函数都没有正确调用。

wooyq4lh

wooyq4lh1#

我认为你需要这样做,因为你正在创建一个新的系列,而不是改变现有的系列:

def float_to_str(df_column):
     df_column=df_column.fillna(value=0,inplace=False)
     df_column=df_column.astype(int,copy=True,errors='raise')
     df_column=df_column.astype(str,copy=True,errors='raise')
     df_column=df_column.apply('{:0>4}'.format)
     return df_column

df['Item Class'] = float_to_str(df['Item Class'])
df2['Item Class'] = float_to_str(df2['Item Class'])
whitzsjs

whitzsjs2#

问题是df_column=...赋值不会传播回DataFrame
作为一个函数来实现这一点的方法是:

def float_to_str(df, colname):
    df[colname].fillna(value=0, inplace=True)
    df[colname] = df[colname].astype(int, copy=True, errors='raise')
    df[colname] = df[colname].astype(str, copy=True, errors='raise')
    df[colname] = df[colname].apply('{:0>4}'.format)

并测试:

df = pd.DataFrame({
        'Item Number': ['ABC123', 'ABC456', 'DEF000', 'HAL987'],
        'Item Description': ['Diamond', 'Sapphire', 'Silicon', 'Jade'],
        'Item Class': [1, 1, 2, numpy.nan],
        'Item Class Description': ['Gemstone', 'Gemstone', 'Mineral', 'Mineral']
    })
print(df)

给出:
| #|项目编号|项目描述|项目分类|物料分类说明|
| --------------|--------------|--------------|--------------|--------------|
| 0|ABC123|钻石|1.0分|宝石|
| 1|ABC456|蓝宝石|1.0分|宝石|
| 二|DEF000|硅|2.0版|矿物|
| 三|HAL987|翡翠|NaN|矿物|
我添加了Nan行只是为了确保.然后这会生成下面的结果:

float_to_str(df, 'Item Class')
print(df)
#项目编号项目描述项目分类物料分类说明
0ABC123钻石零零零一宝石
1ABC456蓝宝石零零零一宝石
DEF000小零零零二矿物
HAL987翡翠矿物

相关问题