【问题标题】:Renaming columns that contain decimal cell values重命名包含十进制单元格值的列
【发布时间】:2014-10-28 11:22:36
【问题描述】:

我有一个熊猫数据框:

import pandas as pd
import numpy as np

data = {'name': ['Bill', np.nan, 'Tony', 'Koli', 'Sally'], 
    'score': [42.32, np.nan, 36.3, 24.522, 73.1], 
    'age': [2, np.nan, 8, 4, 11]}
df = pd.DataFrame(data, columns = ['name','score', 'age'])
df

如果 data['score'] 的名称包含缺失值或十进制数,我希望将其更改为 data['score_decimal']。

在伪代码中:

for each column in df:
    if column contains np.nan's or decimals:
        then column.name = column.name + '_decimal'
    else:
        do nothing

我可以进行基本循环,但我不能进行正则表达式搜索(循环中的“if”行)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是缺失的部分吗?

    contains_nan_dec = False
    for value in df['score'].unique():
        if value.isdigit() or value is np.nan:
            contains_nan_dec = True
            break
    if contains_nan_dec: # pseudocode starts here
        then column.name = column.name + '_decimal'
    else:
        do nothing
    

    【讨论】:

    • 是否可以这样做:if value.isregex([0-9]+(\.[0-9][0-9]?)?) or value is np.nan跨度>
    • 我无法判断您提供的正则表达式是否完全正确。如果它是正确的,那么当然,你可以这样做。
    【解决方案2】:

    我相信检索每列的值、执行小数或 NaN 检查,然后更改列名会更容易。首先我会创建一个函数来做检查

    def check(list):
        for elem in list:
            if type(elem) != type('a'):
                if type(elem) == type(1.1) or np.isnan(elem):
                    return True
        return False
    

    然后我会做类似的事情

    labels = list(df.columns)
    
    for i in xrange(len(labels)):
        if check(list(df[labels[i]])):
            labels[i] += '_decimal'
    df.columns = labels
    

    重命名列

    【讨论】:

    • 刚刚注意到 np.isnan() 不适用于 str 输入。所以你应该添加一个初步检查它是否是str。
    • .isdigit() 不会同时找到年龄(整数)列和分数列(小数)
    • 是的,只是改变看看 type == float
    • 根据您在数据框 np.isnan 中的其他类型可能无法正常工作,您应该在第一个 if 中添加这些格式,以确保您的代码运行
    • 显然您不能直接更改 df.columns 中的项目。因此,让我们创建一个列表,对其进行操作,然后再次插入。编辑
    【解决方案3】:

    你可以像这样简洁地做到这一点:

    float_columns = df.columns[df.dtypes == 'float64']
    new_names = {old_name: old_name + '_decimal' for old_name in float_columns}
    df = df.rename(columns=new_names)
    

    numpy.nan 也被认为是float64,所以这也适用于这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      相关资源
      最近更新 更多