我最近收到了一个数据库中的.csv数据框,该数据库应该返回4列但实际返回8.当我检查时,我发现添加了一些列,因为它似乎属于第四列中的字符串了一个换行符。
换句话说,我看到的是这样的事情:
index A B C D (extra) (extra) (extra) (extra)
0 1 2 'abc\' 'def\' 'ghi\' 'jkl\' 'xyz' some_date
1 1 2 'abc' some_date
2 1 2 'abc\' 'def' some_date
与此相反:
index A B C D
0 1 2 'abcdefghijklxyz' some_date
1 1 2 'abc' some_date
2 1 2 'abcdef' some_date
是否有一种有效的方法将以换行符结尾的列与右侧的列组合在一起?
步骤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