Это вопрос из двух частей.

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 

Я хотел бы создать какой-то цикл, так что если нет ввода, он просто пропускает его. И.Е.

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 действительно складываются (особенно, если я создаю условные циклы для каждого отдельного ввода).

2
samman 20 Дек 2019 в 19:17

1 ответ

Лучший ответ

Я не уверен, полностью ли я понял, что вы пытаетесь выполнить, но из информации в вашем посте я предполагаю, что вы вводите список путей к CSV-файлам, которые необходимо обработать. Я придумал этот сценарий, чтобы упростить процесс получения этих путей к файлам, разбора CSV-файлов в фреймы данных в список, взятия этих фреймов данных и извлечения столбца «Column_4», а затем их объединения в один окончательный фрейм данных. Просто введите пути к CSV-файлам, пока не закончите, а затем введите q, quit или done, и он будет работать с любыми указанными вами путями к файлам!

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)
1
Joules 20 Дек 2019 в 19:41