根据条件重命名熊猫数据框的多列

时间:2019-04-26 06:52:39

标签: python python-3.x pandas

我有一个df,其中我需要将40个列名重命名为空字符串。这可以通过使用.rename()来实现,但是我需要在dict中提供所有列名,需要重命名。我正在寻找通过模式匹配来重命名列的更好方法。凡在列名中找到NULL / UNNAMED的地方,都用空字符串替换。

df1:原始df(在实际df中,我大约有20列为NULL1-NULL20,还有20列为UNNAMED1-UNNAMED20)

    NULL1   NULL2   C1  C2  UNNAMED1    UNNAMED2
0   1   11  21  31  41  51
1   2   22  22  32  42  52
2   3   33  23  33  43  53
3   4   44  24  34  44  54

所需的输出df:

            C1  C2      
0   1   11  21  31  41  51
1   2   22  22  32  42  52
2   3   33  23  33  43  53
3   4   44  24  34  44  54

这可以通过

实现
df.rename(columns={'NULL1':'', 'NULL2':'', 'UNNAMED1':'', 'UNNAMED2':''}, inplace=True)

但是我不想创建40个元素的长字典

5 个答案:

答案 0 :(得分:1)

有可能,但要小心-如果需要选择一个空列,请获取所有空列,因为重复的列名称:

print (df[''])

0  1  11  41  51
1  2  22  42  52
2  3  33  43  53
3  4  44  44  54

使用startswith通过列表理解按元组获取所有列:

df.columns = ['' if c.startswith(('NULL','UNNAMED')) else c for c in df.columns]

您的解决方案应更改:

d = dict.fromkeys(df.columns[df.columns.str.startswith(('NULL','UNNAMED'))], '')
print (d)
{'NULL1': '', 'NULL2': '', 'UNNAMED1': '', 'UNNAMED2': ''}
df = df.rename(columns=d)

答案 1 :(得分:0)

如果要保留其名称的列很少。如下使用list-comprehension

df.columns = [col if col in ('C1','C2') else "" for col in df.columns]

答案 2 :(得分:0)

df.columns = [col if “NULL” not in col else “” for col in df.columns]

这应该可行,因为您可以通过将列表赋值给dataframe列变量来更改列名称。

答案 3 :(得分:0)

如果您要坚持使用rename

def renaming_fun(x):
    if "NULL" in x or "UNNAMED" in x:
        return "" # or None
    return x

df = df.rename(columns=renaming_fun)

如果映射功能变得更复杂,可能会很方便。否则,列表理解将起作用:

df.columns = [renaming_fun(col) for col in cols]

另一种可能性:

df.columns = map(renaming_fun, df.columns)

但是正如已经提到的,用空字符串重命名通常不是您要做的事情。

答案 4 :(得分:0)

您可以在df.rename()中使用dict理解:

idx_filter = np.asarray([i for i, col in enumerate(df.columns) if SOME_STRING_CONDITION in col])
df.rename(columns={col: '' for col in df.columns[idx_filter]}, inplace=True)

在您的情况下,听起来SOME_STRING_CONDITION为'NULL'或'UNNAMED'。

我在寻找有关我自己的问题的更通用列重命名问题(Renaming columns in pandas)的线程上的帮助时解决了这个问题。我没有足够的声誉来将我的解决方案添加为答案或评论(我对stackoverflow还是陌生的),所以我将其发布在这里!

如果您需要保留要过滤的字符串的一部分,此解决方案也很有用。例如,如果您想将“ C”列替换为“ col _”:

idx_filter = np.asarray([i for i, col in enumerate(df.columns) if 'C' in col])
df.rename(columns={col: col.replace('C', 'col_') for col in df.columns[idx_filter]}, inplace=True)