Как экспортировать файлы CSV, содержащие числа с тысячами операторов в python (панды)? - PullRequest
0 голосов
/ 07 января 2019

У меня есть numbers.csv:

Title/BOLA;"Total/1,333.903";

И я запускаю этот кусок кода на нем:

df1 = pd.read_csv("numbers.csv", sep=";",header=None)
print(df1)
df1 = df1.stack().str.split('\s*/\s*', expand=True)
df1 = df1.reset_index(level=1, drop=True).set_index(0, append=True)[1].unstack()  
df1.to_csv("test.csv")
df1 = df1.stack().str.split('\s*/\s*', expand=True)
df1 = df1.reset_index(level=1, drop=True).set_index(0, append=True)[1].unstack()
df1.to_csv("final_csv.csv")

print(df1) возвращает:

                   0                                               1   2
0  Title/BOLA  Total/1,333.903 NaN

Когда я сохраняю в final_csv.csv число 1,349.098 превращается в 1. Вместо этого я хотел бы сохранить номер 1349.098. Вы можете мне помочь?

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Если у вас есть этот кадр данных после строки 4 в вашем коде:

df1 = df1.reset_index(level=1, drop=True).set_index(0, append=True)[1].unstack()
print(df1)

    Title   Total
0   BOLA    1,333.903

Затем вы можете удалить запятую и преобразовать строку в число с плавающей точкой:

df1['Total'] = df1['Total'].str.replace(',', '').astype(float)

И результат выглядит следующим образом:

    Title   Total
0   BOLA    1333.903
0 голосов
/ 07 января 2019

Попробуйте флаг thousands=',' во время чтения данных CSV. См. Параметры pandas.read_csv

df1 = pd.read_csv("numbers.csv", sep=";", header=None, thousands=',')

CSV ВЫХОД:

Title,Total
BOLA,"1,333.903"
0 голосов
/ 07 января 2019

Вы должны заключить в кавычки числовое поле во время записи и чтения, поскольку оно содержит символ разделителя ',':

pandas.to_csv(..., quoting=1) # for QUOTE_ALL
pandas.to_csv(..., quoting=0) # for QUOTE_MINIMAL
pandas.read_csv(..., quoting=...) # ditto

См. «Раздел цитат» на страницах документации to_csv , read_csv

0 голосов
/ 07 января 2019

Похоже, вы читаете в столбце 1 в виде строки, а затем записываете ее обратно в виде строки. Это означает, что он будет продолжать переносить запятые. В to_csv("test.csv") разделитель не указывается, поэтому по умолчанию используется запятая. Я предполагаю, что 349.098 появляется в следующем столбце. Вы можете обойти это, указав разделитель в df1.to_csv("test.csv", sep=';'), но сначала убедитесь, что ваш код выполняет то, о чем вы думаете.

...