python - 仅当其值不属于特定数据类型时才连接 3+ 列

标签 python pandas numpy dataframe

我有一个从 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的示例。我需要做出的假设:

  1. 我假设唯一包含字符串对象的列是'short_desc',否则很难理解'short_desc'中包含哪些文本,并且事实并非如此,因为我在未对齐的数据中没有看到规律的模式。

  2. 我还假设您的两个日期只能在需要时移动到位,并且您的 '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/

相关文章:

python - 合并以相同字母开头的 pandas DataFrame 列

python - tensorflow.keras.preprocessing.text.Tokenizer.texts_to_sequences 的 Numpy 数组给出了奇怪的输出,list([2]) 而不是 [[2]]

python - 为 2D Numpy 数组逐行插值

python - 将 QiMessaging 服务应用程序打包并部署到 Pepper/Nao 机器人的正确方法是什么?

Python:(悲情)多处理与类方法

python - 使用 TensorFlow 层的 `kernel_constraint` 实现权重归一化

python - Pandas :按有/过滤问题进行分组

python - 从 SQL 表(Python)中选择数据时如何去掉括号?

python - 基于 bin 的子集 pandas DataFrame

python - 如何从矩阵中选择特定的列索引?