首页 > 解决方案 > 根据 DataFrame 中的值重命名具有相同列名的列

问题描述

我有一个 DataFrame 可以包含具有相同列名的列。基于我想重命名列名的值,所以没有重复。我已经尝试了一些东西,但是每次我尝试遍历列并重命名它们时,我都会得到列名。df.rename(columns=df.columns[i]: 'some_name'}) 似乎也使用了列名。

假设我有一个数据框;

df = pd.DataFrame({"A": [10kg], "B": [4], "A": [4%]})

我想根据行值重命名名为“A”的列,以便得到

   A     B  A%
0  10kg  4  4

我试过这样的事情:

for i in range(0, len(df.columns)):
    if 'A' in df.columns[i]:
        if '%' in df.iloc[:,i].values[0]:
            df = df.rename(columns={df.columns[i]: 'A_%'})

但这也将第一列重命名为“A”。还有其他方法可以根据位置重命名吗?

标签: pythonpandasdataframe

解决方案


新列名的单一列表理解:

import pandas as pd

df = pd.concat([pd.DataFrame({"A": ['10kg'], "B": ['4']}), 
                pd.DataFrame({"A": ['4%']})], axis=1)


df.columns = [c + '_%'
              if df.applymap(lambda x: '%' in x).any(axis=0).iloc[ic]
              else c for ic, c in enumerate(df.columns)]

编辑——更好:

import pandas as pd

df = pd.concat([pd.DataFrame({"A": ['10kg'], "B": ['4']}), 
                pd.DataFrame({"A": ['4%']})], axis=1)

has_percentage = df.applymap(lambda x: '%' in x).any(axis=0)
df.columns = [c + '_%' if has_percentage.iloc[ic]
              else c for ic, c in enumerate(df.columns)]

推荐阅读