如何使用字典键和值重命名 pandas DataFrame 中的列?

Posted

技术标签:

【中文标题】如何使用字典键和值重命名 pandas DataFrame 中的列?【英文标题】:How do I use dictionary keys and values to rename columns in a pandas DataFrame? 【发布时间】:2017-06-06 14:16:45 【问题描述】:

我正在构建函数来帮助我从网络加载数据。就加载数据而言,我试图解决的问题是列名因源而异。例如,Yahoo Finance 数据列标题如下所示 Open、High、Low、Close、Volume、Adj Close。 Quandl.com 将拥有包含 DATE、VALUE、date、value 等的数据集。全部大写和小写都会将所有内容以及 Value 和 Adj 排除在外。关闭在很大程度上意味着同样的事情。我想将具有不同名称但含义相同的列与一个值相关联。例如调整。收盘并看好两者 = AC;打开,打开,然后全部打开 = O。

所以我有一个 Csv 文件(“Functions//ColumnNameChanges.txt”),它存储 dict() 键和列名的值。

Date,D
Open,O
High,H

然后我写了这个函数来填充我的字典

def DictKeyValuesFromText ():

    Dictionary = 
    TextFileName = "Functions//ColumnNameChanges.txt"
    with open(TextFileName,'r') as f:
        for line in f:
            x = line.find(",")
            y = line.find("/")
            k = line[0:x]
            v = line[x+1:y]

            Dictionary[k] = v
    return Dictionary

这是 print(DictKeyValuesFromText()) 的输出

'': '', 'Date': 'D', 'High': 'H', 'Open': 'O'

下一个函数是我的问题所在

def ChangeColumnNames(DataFrameFileLocation):
    x = DictKeyValuesFromText()
    df = pd.read_csv(DataFrameFileLocation)
    for y in df.columns:
        if y not in x.keys():
            i = input("The column " +  y +  " is not in the list, give a name:")
            df.rename(columns=y:i) 
        else:
            df.rename(columns=y:x[y])

    return df

df.rename 不起作用。这是我得到的输出 print(ChangeColumnNames("Tvix_data.csv"))

The column Low is not in the list, give a name:L
The column Close is not in the list, give a name:C
The column Volume is not in the list, give a name:V
The column Adj Close is not in the list, give a name:AC
            Date        Open        High         Low       Close    Volume  \
0     2010-11-30  106.269997  112.349997  104.389997  112.349997         0
1     2010-12-01   99.979997  100.689997   98.799998  100.689997         0
2     2010-12-02   98.309998   98.309998   86.499998   86.589998         0

列名应该是 D、O、H、L、C、V。我遗漏了一些东西,任何帮助将不胜感激。

【问题讨论】:

DF.rename 本身并不是 inplace 操作。对于这两种情况,您都需要将这些更改分配回来,例如 - df.rename(..., inplace=True) 成功了!!!完美!! 【参考方案1】:

df.rename 工作得很好,但默认情况下它不是就地的。重新分配其返回值或使用inplace=True。它需要一个字典,其中旧名称作为键,新名称作为值。

df = df.rename(columns = 'col_a': 'COL_A', 'col_b': 'COL_B')

df.rename(columns = 'col_a': 'COL_A', 'col_b': 'COL_B', inplace=True)

【讨论】:

我的整体代码是否过于复杂?任何帮助将不胜感激 在 Pandas 0.23.3 版中,DataFrame.rename 的帮助声明“我们强烈建议使用关键字参数来阐明您的意图。”轴的默认值为'index'。对于这个版本,答案应该是:df.rename('col_a': 'COL_A', 'col_b': 'COL_B', axis = 'columns',inplace=True) 另外,由于未知原因,df = df.rename('col_a': 'COL_A', ...)没有工作,但df = df.rename(columns = 'col_a': 'COL_A', ...)工作【参考方案2】:

好吧,当你已经有了字典时,将它存储在一个变量中说

DC = '': '', 'Date': 'D', 'High': 'H', 'Open': 'O'

DC 现在可以映射到数据框列,例如

df.columns = df.columns.map(DC)

如果你想使用 rename() 方法,你可以简单地使用

df = df.rename(columns = DC)

【讨论】:

以上是关于如何使用字典键和值重命名 pandas DataFrame 中的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板中获取字典键和值?

显示 % forloop% 的键和值的 Django 模板:如何遍历模板中的字典?

如何从一系列字典中创建键和值的数据框[重复]

使用键和值约束扩展字典

Map里面的键和值可以为空吗

将字典的键和值并行传递给函数?