问题描述
我需要读取 .DAT 或 .TXT 文件,提取列名并将它们分配给新名称并将数据写入 Pandas 数据帧。
我有一个名为“filetype”的环境变量,根据它的值(DAT 或 TXT),我需要相应地读取文件并从中提取列名并分配给新的列名。
我输入的 .dat/.txt 文件只有 2 列,如下所示:
LN_ID,LN_DT
1234,10/01/2020
4567,10/01/2020
8888,10/01/2020
9999,10/01/2020
读取上述文件并创建新列 new_loan_id=loan_id 和 new_ln_dt=ln_dt 并写入熊猫数据帧
我已经尝试使用如下所示的 Pandas,但它给出了一些错误,我还想首先根据环境变量“filetype”值检查 myfile 是 .dat 还是 .txt 并继续。
df=pd.read_csv('myfile.dat',sep=',')
new_cols=['new_ln_id','new_ln_dt']
df.columns=new_cols
我认为可能有一些更好更简单的方法。感谢有人可以提供帮助。谢谢!
解决方法
从您的问题中不清楚您是想要两个新的空列还是想要替换现有名称。无论哪种方式,您都可以为以下给出的 dte 执行此操作:
添加列
LN_ID LN_DT
0 1234 10/01/2020
1 4567 10/01/2020
2 8888 10/01/2020
3 9999 10/01/2020
定义新列
cols = ['new_ln_id','new_ln_dt']
和`
print(pd.concat([dte,pd.DataFrame(columns=cols)]))
给出
LN_ID LN_DT new_ln_id new_ln_dt
0 1234.0 10/01/2020 NaN NaN
1 4567.0 10/01/2020 NaN NaN
2 8888.0 10/01/2020 NaN NaN
3 9999.0 10/01/2020 NaN NaN
替换列名
df.rename(columns={"LN_ID": "new_ln_id","LN_DT": "new_ln_dt"})
感谢您的回复,对于造成的混乱,我们深表歉意。我想重命名 2 列。但是,实际上,我想首先检查它是基于名为“filetype”的 unix 环境变量的 .dat 文件还是 .txt 文件。
例如:如果 filetype='TXT' 或 'DAT' 则将输入文件(如 'abc.dat' 或 'abc.txt')读入新的 Pandas 数据框并重命名 2 列。我希望它很清楚。
这就是我所做的。我创建了一个函数来检查文件类型是“dat”还是“txt”并将文件读入熊猫数据帧,然后我重命名了 2 列。该函数正在加载数据,但没有根据需要重命名列。感谢有人能指出我遗漏了什么。
filetype=os.environ['TYPE']
print(filetype)
DAT
def load(file_type):
if file_type.lower()=="dat":
df=pd.read_csv(input_file,sep=',',engine='python')
if df.columns[0]=="LN_ID":
df.columns[0]="new_ln_id"
if df.columns[1]=="LN_DT":
df.columns[1]="new_ln_dt"
return(df)
else:
if file_type.lower()=="txt":
df=pd.read_csv("infile",sep=",",engine='python')
if df.columns[0]=="LN_ID":
df.columns[0]="new_ln_id"
if df.columns[1]=="LN_DT":
df.columns[1]="new_ln_dt"
return(df)
load(filetype)
替代方案
from os import listdir
from os.path import isfile,join
onlyfiles = [f for f in listdir(path) if isfile(join(path,f))]
filename = os.path.join(path,onlyfiles[0])
if filename.endswith('.txt'):
dte = pd.read_csv(filename,")
elif filename.endswith('.dat'):
dte = pd.read_csv(filename,")
dte.rename(columns={"LN_ID": "new_ln_id","LN_DT": "new_ln_dt"})