我正在构建功能来帮助我从Web加载数据。就加载数据而言,我试图解决的问题是列名称因来源而异。例如,Yahoo Finance数据列标题看起来像“打开”,“高”,“低”,“关闭”,“交易量”,“调整关闭”。Quandl.com将具有包含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=True
。它期望使用旧名称作为键,新名称作为值的字典。
df = df.rename({'col_a': 'COL_A', 'col_b': 'COL_B'})
要么
df.rename({'col_a': 'COL_A', 'col_b': 'COL_B'}, inplace=True)
好吧,当您已经将字典存储在变量中时,说
DC = {'': '', 'Date': 'D', 'High': 'H', 'Open': 'O'}
DC现在可以映射到数据框列,例如
df.columns = df.columns.map(DC)
如果您想使用rename()方法,可以简单地使用
df = df.rename(columns = DC)