从数据框写入 csv 时如何去除多余的空格

How to strip extra spaces when writing from dataframe to csv

从一个 xlsx 文件中读入多个工作表 (6) 并创建单独的数据帧。想要将每个写出到管道分隔的 csv。

ind_dim.to_csv (r'/mypath/ind_dim_out.csv', index = None, header=True, sep='|')

目前输出如下: 1|value1 |value2 |word1 word2 word3 等等

想要去除尾随空白

以下命令相当容易地修剪左右空格:

 if (!require(dplyr)) {
   install.packages("dplyr")
 }
 library(dplyr)

 if (!require(stringr)) {
   install.packages("stringr")
 }
 library(stringr)

 setwd("~/wherever/you/need/to/get/data")

 outputWithSpaces <- read.csv("CSVSpace.csv", header = FALSE)
 print(head(outputWithSpaces), quote=TRUE)

 #str_trim(string, side = c("both", "left", "right"))

 outputWithoutSpaces <- outputWithSpaces %>% mutate_all(str_trim)
 print(head(outputWithoutSpaces), quote=TRUE)

起始数据:

                                  V1                           V2                          V3            V4
 1    "Something is interesting.   " "This is also Interesting. "                      "Not " "Intereting "
 2  "  Something with leading space"                  "  Leading" "  Spaces with many words."      " More."
 3 "  Leading and training Space.  "                   "  More  "  "  Leading and trailing. "  "  Spaces. "

结果:

                               V1                          V2                        V3           V4
 1    "Something is interesting." "This is also Interesting."                     "Not" "Intereting"
 2 "Something with leading space"                   "Leading" "Spaces with many words."      "More."
 3  "Leading and training Space."                      "More"   "Leading and trailing."    "Spaces."

建议

将方法 .apply(lambda x: x.str.rstrip()) 包含到您的输出字符串中(在 .to_csv() 调用之前)以从 DataFrame 的每个字段中去除右侧尾随空白。它看起来像:

变化:

ind_dim.to_csv(r'/mypath/ind_dim_out.csv', index = None, header=True, sep='|')

收件人:

ind_dim.apply(lambda x: x.str.rstrip()).to_csv(r'/mypath/ind_dim_out.csv', index = None, header=True, sep='|')

它可以很容易地插入到使用'.'的输出代码字符串中。引用。要处理多种数据类型,我们可以 通过包含参数 dtype='str':

在导入时强制执行 'object' dtype
ind_dim = pd.read_excel('testing_xlsx_nums.xlsx', header=0, index_col=0, sheet_name=None, dtype='str')

或在 DataFrame 上通过:

df = pd.DataFrame(df, dtype='str')

证明

我做了一个模型,其中 .xlsx 文档有 5 sheets,每个 sheet 有三列:第一列有除第 2 行中的一个空单元格外的所有数字;第二列 在字符串上有一个前导空白和一个尾随空白,第 3 行中有一个空单元格,第 4 行中有一个数字;第三列 * 所有字符串都以空格开头,第 4 行 * 为空值。包括整数索引和整数列。每个 sheet 中的文本是:

    0   1   2
0   11111    valueB1     valueC1
1        valueB2     valueC2
2   33333        valueC3
3   44444   44444   
4   55555    valueB5     valueC5

此代码将我们的 .xlsx testing_xlsx_dtype.xlsx 读入 DataFrame 字典 ind_dim

接下来,它使用 for 循环遍历每个 sheet,将 sheet 名称变量作为引用单个 [=152] 的键=] 数据框。它通过将 lambda x: x.str.rstrip() lambda 函数传递给在 sheet/DataFrame 上调用的 .apply() 方法,将 .str.rstrip() 方法应用于整个 sheet/DataFrame。

最后,它使用 .to_csv() 将 sheet/DataFrame 作为 .csv 文件输出,如 OP post.

中所示
# reads xlsx in 
ind_dim = pd.read_excel('testing_xlsx_nums.xlsx', header=0, index_col=0, sheet_name=None, dtype='str')

# loops through sheets, applies rstrip(), output as csv '|' delimit
for sheet in ind_dim:
    ind_dim[sheet].apply(lambda x: x.str.rstrip()).to_csv(sheet + '_ind_dim_out.csv', sep='|')

Returns:

|0|1|2
0|11111| valueB1| valueC1
1|| valueB2| valueC2
2|33333|| valueC3
3|44444|44444|
4|55555| valueB5| valueC5

(注意我们的第 2 列字符串 不再有尾随 space)。

我们还可以使用循环遍历字典项的循环来引用每个 sheet;语法看起来像 for k, v in dict.items() 其中 kvkeyvalue:

# reads xlsx in 
ind_dim = pd.read_excel('testing_xlsx_nums.xlsx', header=0, index_col=0, sheet_name=None, dtype='str')

# loops through sheets, applies rstrip(), output as csv '|' delimit
for k, v in ind_dim.items():
    v.apply(lambda x: x.str.rstrip()).to_csv(k + '_ind_dim_out.csv', sep='|')

备注:

我们仍然需要根据需要使用 header=names= 参数为 selecting/ignoring 索引和列应用正确的参数。对于这些示例,为了简单起见,我只是传递了 =None

去除前导 前导和尾随 space 的其他方法分别是:.str.lstrip().str.strip()。它们也可以应用于整个 DataFrame,使用传递给 DataFrame 上调用的 .apply() 方法的 .apply(lambda x: x.str.strip()) lambda 函数。

只有 1 列: 如果我们只想从一列中剥离,我们可以直接在列本身上调用 .str 方法。例如,要从 DataFrame df 中名为 column2 的列中去除前导和尾随 spaces,我们可以这样写:df.column2.str.strip().

数据类型不是字符串:导入我们的数据时,pandas将假设具有相似数据的列的数据类型类型。我们可以通过在导入时将 dtype='str' 传递给 pd.read_excel() 调用来覆盖它。

pandas pandas.read_excel 上的 1.0.1 文档 (04/30/2020):

"dtypeType 名称或列的字典 -> 类型,默认 None

数据或列的数据类型。例如。 {‘a’: np.float64, ‘b’: np.int32} 使用对象来保存存储在 Excel 中的数据,而不是解释 dtype。如果指定了转换器,它们将被应用而不是 dtype 转换。"

我们可以在使用 pd.read_excel.() 导入时传递参数 dtype='str' 如上所示 )。如果我们想在我们正在使用的 DataFrame 上强制执行单一数据类型,我们可以将其设置为等于自身并将其传递给 pd.DataFrame() 并使用参数 dtype='str 像:df = pd.DataFrame(df, dtype='str')

希望对您有所帮助!