使用用户输入语句使用熊猫创建数据表

时间:2019-12-20 16:17:39

标签: python pandas

这是两部分的问题。

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行的输入确实加起来(尤其是如果我还要为每个输入创建条件循环时)。

1 个答案:

答案 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)