Zac*_*ack 5 python dictionary dataframe pandas
我正在构建功能来帮助我从Web加载数据。就加载数据而言,我试图解决的问题是列名称因来源而异。例如,Yahoo Finance数据列标题看起来像“打开”,“高”,“低”,“关闭”,“交易量”,“调整关闭”。Quandl.com将具有包含DATE,VALUE,日期,值等的数据集。所有大写和小写字母将丢弃所有内容以及Value和Adj。封闭在很大程度上意味着相同的东西。我想将名称不同但含义相同的列关联到一个值。例如调整。收盘价和价值均= AC;打开,打开,然后全部打开=O。
因此,我有一个Csv文件(“ Functions // ColumnNameChanges.txt”),该文件存储dict()键和列名的值。
Date,D
Open,O
High,H
Run Code Online (Sandbox Code Playgroud)
然后我写了这个函数来填充我的字典
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
Run Code Online (Sandbox Code Playgroud)
这是print(DictKeyValuesFromText())的输出
{'': '', 'Date': 'D', 'High': 'H', 'Open': 'O'}
Run Code Online (Sandbox Code Playgroud)
下一个功能是我的问题所在
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
列名称应为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'}
Run Code Online (Sandbox Code Playgroud)
DC现在可以映射到数据框列,例如
df.columns = df.columns.map(DC)
Run Code Online (Sandbox Code Playgroud)
如果您想使用rename()方法,可以简单地使用
df = df.rename(columns = DC)
Run Code Online (Sandbox Code Playgroud)