Как удалить десятичную точку из строки с помощью панд - PullRequest
0 голосов
/ 19 марта 2019

Я читаю файл xls и преобразую его в csv-файл с помощью pyspark.Мои входные данные имеют строковый формат 101101114501700 в файле xls.Но после преобразования его в формат CSV с использованием панд и записи в папку данных, мои данные отображаются как 101101114501700.0.Мой код приведен ниже.Пожалуйста, помогите мне, почему я получаю десятичную часть в данных.

for file in os.listdir("/path/to/file"):
     if file.endswith(".xls"):
       filepath = os.path.join("/path/to/file",file)         
       filepath_pd = pd.ExcelFile(filepath)
       names = filepath_pd.sheet_names        
       df = pd.concat([filepath_pd.parse(name) for name in names])        
       df1 = df.to_csv("/path/to/file"+file.split('.')[0]+".csv", sep=',', encoding='utf-8', index=False)
       print(time.strftime("%Y%m%d-%H%M%S") + ": XLS files converted to CSV and moved to folder"

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Я думаю, что поле автоматически разбирается как float при чтении Excel.Я бы исправил это позже:

df['column_name'] = df['column_name'].astype(int)

Если в вашем столбце есть пустые значения, вы не можете преобразовать их в целое число, поэтому сначала вам нужно будет заполнить пустые значения:

df['column_name'] = df['column_name'].fillna(0).astype(int)

Затем вы можете объединить ихранить, как вы это делали

0 голосов
/ 19 марта 2019

Ваш вопрос не имеет ничего общего с Spark или PySpark.Это связано с Pandas .

Это потому, что Pandas автоматически интерпретирует и выводит тип данных столбцов.Поскольку все значения вашего столбца являются числовыми, Pandas будет рассматривать его как float тип данных.

Чтобы избежать этого, метод pandas.ExcelFile.parse принимает аргумент с именем converters, поэтому выможет использовать это, чтобы сообщить Pandas конкретный тип данных столбца:

# if you want one specific column as string
df = pd.concat([filepath_pd.parse(name, converters={'column_name': str}) for name in names])

ИЛИ

# if you want all columns as string
# and you have multi sheets and they do not have same columns
# this merge all sheets into one dataframe
def get_converters(excel_file, sheet_name, dt_cols):
    cols = excel_file.parse(sheet_name).columns
    converters = {col: str for col in cols if col not in dt_cols}
    for col in dt_cols:
        converters[col] = pd.to_datetime
    return converters

df = pd.concat([filepath_pd.parse(name, converters=get_converters(filepath_pd, name, ['date_column'])) for name in names]).reset_index(drop=True)

ИЛИ

# if you want all columns as string
# and all your sheets have same columns
cols = filepath_pd.parse().columns
dt_cols = ['date_column']
converters = {col: str for col in cols if col not in dt_cols}
for col in dt_cols:
    converters[col] = pd.to_datetime
df = pd.concat([filepath_pd.parse(name, converters=converters) for name in names]).reset_index(drop=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...