如何根据 python 中的条件重命名列名?
How to Rename Column name based on condition in python?
enter image description here我有一个包含 4 列的数据框,我必须根据其项目重命名列。
例子 :
如果大多数列项目是字符串,则将其重命名为 Name
如果大多数是浮点数,则将其重命名为值
请找到附图以供参考。
IIUC,这对你有用
这里发生的事情是 df[col].count()
将计算列中数值的数量。假设列的长度为 10,如果 count 大于 6,则假定列的多数为 numbers & 更改为 name nums
。但是,将多个列命名为相同并不是一个好主意。
cols = df.columns
for col in cols:
if (df[col].count()/df.shape[0]) > 0.5:
df.rename({col:'nums'}, axis=1, inplace =True)
else:
pass
这个怎么样?
我们可以使用 select_dtypes
并将它们传递给列表以计算长度。
col_floats = df.select.dtypes(include='float').columns.tolist()
col_strings = df.select.dtypes(include='object').columns.tolist()
if len(col_floats) > len(col_strings):
df.columns.map(lambda x : 'Values ' + x)
else:
df.columns.map(lambda x : 'AOR ' + x)
您可以为您的用例编辑逻辑,但如果没有您的示例数据集和示例输出,很难说出您想要什么。
编辑
查看你的 DF,我发现你想测试每个数据帧系列中的数字,看看哪个更大,因为我们没有你的数据帧的文本样本,这很难说,但这样的事情可能工作 :
new_name = []
for columns in df.columns:
n = pd.to_numeric(df[f'{columns}'],errors='coerce')
if n.isna().sum() > n.dropna().count(): # tests if strings are greater than numbers
new_name.append('AOR')
else:
new_name.append('Value')
new_col_dict = dict(zip(df.columns.tolist(),new_name))
然后您可以简单地将 new_names 分配给您的列并使用 new_col_dict
字典检查输出。
在我自己的数据帧上进行测试,我在对象列中添加了一些随机整数,得到以下结果:
{'Business Date': 'Value',
'First Name': 'AOR',
'Hours': 'Value',
'Last Name': 'AOR',
'Number': 'Value',
'Pay Code': 'Value', # I added more ints than strings to this column and the test above worked.
'Pay Time End': 'Value',
'Pay Time Start': 'Value',
'Site Name': 'AOR'}
enter image description here我有一个包含 4 列的数据框,我必须根据其项目重命名列。 例子 : 如果大多数列项目是字符串,则将其重命名为 Name 如果大多数是浮点数,则将其重命名为值 请找到附图以供参考。
IIUC,这对你有用
这里发生的事情是 df[col].count()
将计算列中数值的数量。假设列的长度为 10,如果 count 大于 6,则假定列的多数为 numbers & 更改为 name nums
。但是,将多个列命名为相同并不是一个好主意。
cols = df.columns
for col in cols:
if (df[col].count()/df.shape[0]) > 0.5:
df.rename({col:'nums'}, axis=1, inplace =True)
else:
pass
这个怎么样?
我们可以使用 select_dtypes
并将它们传递给列表以计算长度。
col_floats = df.select.dtypes(include='float').columns.tolist()
col_strings = df.select.dtypes(include='object').columns.tolist()
if len(col_floats) > len(col_strings):
df.columns.map(lambda x : 'Values ' + x)
else:
df.columns.map(lambda x : 'AOR ' + x)
您可以为您的用例编辑逻辑,但如果没有您的示例数据集和示例输出,很难说出您想要什么。
编辑
查看你的 DF,我发现你想测试每个数据帧系列中的数字,看看哪个更大,因为我们没有你的数据帧的文本样本,这很难说,但这样的事情可能工作 :
new_name = []
for columns in df.columns:
n = pd.to_numeric(df[f'{columns}'],errors='coerce')
if n.isna().sum() > n.dropna().count(): # tests if strings are greater than numbers
new_name.append('AOR')
else:
new_name.append('Value')
new_col_dict = dict(zip(df.columns.tolist(),new_name))
然后您可以简单地将 new_names 分配给您的列并使用 new_col_dict
字典检查输出。
在我自己的数据帧上进行测试,我在对象列中添加了一些随机整数,得到以下结果:
{'Business Date': 'Value',
'First Name': 'AOR',
'Hours': 'Value',
'Last Name': 'AOR',
'Number': 'Value',
'Pay Code': 'Value', # I added more ints than strings to this column and the test above worked.
'Pay Time End': 'Value',
'Pay Time Start': 'Value',
'Site Name': 'AOR'}