我有一个列名如下的数据帧:
Column (Name) Column Name 2 Column3 Column (4)
NULL NULL C3 100
22 C44 C55 NULL
2 C5 C11 13
我希望用均值和最小值替换来自子集Column (Name)
和Column (4)
的空值。如何做到这一点?Column (Name)
和Column (4)
中的值为数字
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
我得到以下错误:
TypeError: can only concatenate str (not "int") to str
预期输出:
Column (Name) Column Name 2 Column3 Column (4)
12 NULL C3 100
22 C44 C55 13
2 C5 C11 13
您的错误意味着列中存在一些非数字值。
测试列是否为数字,如果不是,则将其转换为df.dtypes:
print(df.dtypes)
然后您可以测试哪些值是错误的:
print (df.loc[pd.to_numeric(df['Column (Name)'], errors='coerce').isna(), 'Column (Name)'])
最后一次转换为数字:
df['Column (Name)'] = pd.to_numeric(df['Column (Name)'], errors='coerce')
df['Column (4)'] = pd.to_numeric(df['Column (4)'], errors='coerce')
或者,如果需要转换多列:
cols = ['Column (Name)','Column (4)']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')
然后使用您的解决方案:
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
或者您可以使用DataFrame.agg
:
df = df.fillna(df.agg({'Column (Name)':'mean', 'Column (4)':'min'}))
print (df)
Column (Name) Column Name 2 Column3 Column (4)
0 12.0 NaN C3 100.0
1 22.0 C44 C55 13.0
2 2.0 C5 C11 13.0
实际上使用您的代码我没有错误。请将dtypes
与我的代码进行比较。
import io
import pandas as pd
正在读取数据。
df = pd.read_csv(io.StringIO("""
Column (Name) Column Name 2 Column3 Column (4)
NULL NULL C3 100
22 C44 C55 NULL
2 C5 C11 13
"""), sep="ss+", engine="python")
检查数据类型。
df.dtypes
Column (Name) float64
Column Name 2 object
Column3 object
Column (4) float64
dtype: object
填写平均值和最小的代码
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
填写的值分别为12.0和13.0。
尝试连接字符串和整数时会引发此错误。只有在存在相同类型的情况下才能进行连接。尝试使用str((方法将整数转换为字符串。