Python:基于“ \”连接列

时间:2018-08-29 21:26:13

标签: python newline concat string-concatenation

我最近从数据库接收到一个.csv数据帧,该数据库应该返回4列但实际上返回8。当我检查时,我发现已经添加了一些列,因为它看起来像是属于该字符串的字符串。第四列中有换行符。

换句话说,我看到这样的东西:

import org.apache.spark.sql.types.IntegerType
df.withColumn("a", lit("1").cast(IntegerType)).show()

与此相反:

#LandingButtons{ text-align: center; Margin: 0 auto; }

是否有一种有效的方法可以将以换行结尾的列与右侧的列合并?

1 个答案:

答案 0 :(得分:1)

步骤1: 首先,您需要提取'D'列,该列已拆分并放置在每行非空值的末尾。此外,'D'中的每个值都应从其当前位置中删除。您可以使用这样的循环来做到这一点:

import pandas as pd

D_col = []
for i,row in df.iterrows():
    # get the index of the last non-empty/null value in the row
    d_idx = next(j for j,x in reversed(list(enumerate(row))) if x)
    # put the value at that index in D_col
    D_col.append(row[d_idx])
    # replace that value with ''
    row.iloc[d_idx] = ''

这将从您的DataFrame中删除some_date值,并将它们放在列表D_col中。

步骤2: 现在,您可以使用str.replace删除斜杠,并使用str.cat合并列。这是一个示例:

from functools import reduce

columns_to_join = ['C', 'D', 'e1', 'e2', 'e3']
# first remove the slashes
cleaned_columns = [df[col].fillna('').str.replace('\\', '') for col in columns_to_join]

# create an empty Series to start reduce with
empty_series = pd.Series(['' for _ in range(len(df))])
# iterate over the cleaned columns and join them (using str.cat) into one column
C_col = reduce(lambda acc, col: acc.str.cat(col.fillna('')), cleaned_columns, empty_series)

第3步: 将所有这些整合到一个最终的DataFrame中。方法如下:

new_df = pd.DataFrame(df[['A', 'B']])
new_df['C'] = C_col
new_df['D'] = D_col