我有一个从 SQL Server 中提取的数据框。转换为 .csv 时,数据解析不正确,现在我的列包含错误的数据。我正在尝试使用 pandas 将所有内容移回原位。具体来说,我有一个应包含“简短描述”的字段。一些描述被分隔成单独的字段,我想将它们全部连接到适当的字段中。问题是,某些字段包含正确属于那里的日期,我需要在连接时跳过它们。
我尝试以多种不同的方式使用df.apply()
,但我似乎无法“跳过”包含pd.Timestamp
的值> 数据类型。
例如:
df_test.apply(lambda x: ' '.join(x) if type(x) != pd.Timestamp else '')
示例 df:
df_so_test = pd.DataFrame([[1, 2, 'some description', pd.to_datetime('2019-01-01'), 'some more text', '']
, [2, 3, 'another description', 'some other text', '', pd.to_datetime('2019-01-02')]
, [3, 4, 'a third descirption', '', pd.to_datetime('2019-01-03'), pd.to_datetime('2019-01-04')]]
, columns=['random_col_1','random_col_2', 'short_desc', 'date_1', 'date_2', 'random_col_3'])
预期输出:
df_expected = pd.DataFrame([[1, 2, 'some description some more text', pd.to_datetime('2019-01-01'), '', '']
, [2, 3, 'another description some other text', pd.to_datetime('2019-01-02'), '', '']
, [3, 4, 'a third descirption', pd.to_datetime('2019-01-03'), pd.to_datetime('2019-01-04'), '']]
, columns=['random_col_1','random_col_2', 'short_desc', 'date_1', 'date_2', 'random_col_3'])
最佳答案
这里是一个使用apply
的示例。我需要做出的假设:
我假设唯一包含字符串对象的列是
'short_desc'
,否则很难理解'short_desc'
中包含哪些文本,并且事实并非如此,因为我在未对齐的数据中没有看到规律的模式。我还假设您的两个日期只能在需要时移动到位,并且您的
'random_col_3'
是由错误的读取生成的,所以我要最后把它扔掉。
如果实际列的名称与发布的示例不对应,您可能需要修复它们。
def fixdb(row):
found = [x for x in row if isinstance(x, str)]
if len(found) > 1:
row['short_desc'] = ' '.join(found)
dates = [x for x in row if isinstance(x, pd.Timestamp)]
try:
row['date_1'] = dates[0]
except IndexError:
row['date_1'] = np.nan
try:
row['date_2'] = dates[1]
except IndexError:
row['date_2'] = np.nan
return row
df_out = df_so_test.apply(fixdb, axis=1).drop('random_col_3', axis=1)
这是使用提供的输出的 df_out
:
random_col_1 random_col_2 short_desc date_1 date_2
0 1 2 some description some more text 2019-01-01 NaT
1 2 3 another description some other text 2019-01-02 NaT
2 3 4 a third descirption 2019-01-03 2019-01-04
关于python - 仅当其值不属于特定数据类型时才连接 3+ 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57332569/