这是两部分的问题。
1)我正在根据用户输入创建数据表,但是有没有一种方法可以设计代码,以便如果用户不输入任何内容,就不会破坏脚本?即
A=input('some input\n')
B=input('some input\n')
df1=pd.read_csv(A, sep='\s+', header=None)
df2=pd.read_csv(B, sep='\s+', header=None)
# This works really well if you have inputs for A and B, but if you don't have an input for B, then you get the error that B is undefined
我想要设置某种循环,因此,如果没有输入,它将跳过它。 I.E。
A=input('some input\n')
if A has some input:
df1=pd.read_csv(A, sep='\s+', header=None)
else:
B=input('some input\n')
if B has some input:
df2=pd.read_csv(B, sep='\s+', header=None)
else:
但这遇到了第二个问题。 2)接下来,我要整理这些表(假设我在上述数据表中定义了列)。
df3=df1.loc[:,'Column_4']
df4=df2.loc[:,'Column_4']
df5=pd.concat([df3,df4],axis=1)
因此,如果在上述循环中用户未为B输入任何内容,那么您将无法创建df2,这意味着没有df4。现在,我也可以将df4放入循环中,这样我就不会得到未定义df4的错误,但这仍然会导致形成df5的问题,而我无法将其放入上述任何循环中。
最后,顺便说一句,是否有任何方法可以简化此过程?理想情况下,我想让用户输入10或20个输入,但是A = input(),B = input(),C = input()以及其中的每一个都会包含很多代码行带有自己的pd.read和.loc行的输入确实加起来(尤其是如果我还要为每个输入创建条件循环时)。
答案 0 :(得分:1)
我不确定我是否完全理解您要完成的工作,但是从您发布的信息中,我假设您输入的是需要处理的CSV文件的路径列表。我想出了这个脚本来简化以下过程:获取这些文件路径,将CSV解析为数据帧并放入列表中,获取这些数据帧并提取“ Column_4”列,然后将它们全部串联为一个最终数据帧。只需输入CSV文件路径,直到完成,然后输入q,退出或完成,它将与您提供的任何文件路径一起运行!
import pandas as pd
csv_file_paths = []
data_frames = []
column_4_frames = []
path_input = ''
print('Enter path to CSV file. When done, enter q, quit or done to stop.')
# collect file paths to be processed until q, quit or done is typed and entered
while True:
path_input = input()
if path_input.lower() not in ['q', 'quit', 'done']:
csv_file_paths.append(path_input)
else:
break
# create dataframes for each file, append them to a list
try:
for csv_file in csv_file_paths:
df = pd.read_csv(csv_file, sep='\s+', header=None)
data_frames.append(df)
except Exception as e:
# catch non-existing file error
print('Error loading file: '+str(e))
# collect "column 4"s from each dataframe that was read
for df in data_frames:
column_4_frames.append(df.loc[:,'Column_4'])
# concatenate all "column 4" dataframes into one
concatenated_df = pd.concat(column_4_frames, axis=1)