我正在构建函数来帮助我从Web加载数据。就加载数据而言,我试图解决的问题是列名称因源而异。例如,Yahoo Finance数据列标题看起来像Open,High,Low,Close,Volume,Adj Close。 Quandl.com将拥有具有DATE,VALUE,日期,值等的数据集。全部大写和小写将所有内容抛出,并且值和调整。大部分关闭意味着同样的事情。我想将具有不同名称但具有相同含义的列关联到一个值。例如Adj。关闭并重视两个= AC;打开,打开,打开全部= O。
所以我有一个Csv文件("函数// 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无效。这是我得到的输出(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。我遗漏了任何帮助,我将不胜感激。
答案 0 :(得分:4)
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)
答案 1 :(得分:2)
好吧,当您已经将字典存储在变量中时,说
DC = {'': '', 'Date': 'D', 'High': 'H', 'Open': 'O'}
DC现在可以映射到数据框列,例如
df.columns = df.columns.map(DC)
如果您想使用rename()方法,可以简单地使用
df = df.rename(columns = DC)