当前位置: 首页 > 面试题库 >

将值类型为list的列展平,同时在Pandas中相应地复制另一列的值

东方涛
2023-03-14
问题内容

亲爱的大熊猫专家:

我正在尝试实现一个函数来展平具有类型为list的元素的数据框的列,我想要该列具有类型为list的元素的数据框的每一行,除要展平的指定列之外的所有列都将是重复,而指定的列将具有列表中的值之一。

以下说明了我的要求:

input = DataFrame({'A': [1, 2], 'B': [['a', 'b'], 'c']})
     A   B
0    1   [a, b]
1    2   c

expected = DataFrame({'A': [1, 1, 2], 'B': ['a', 'b', 'c']}, index=[0, 0, 1])

     A   B
0    1   a
0    1   b
1    2   c

我觉得可能有一个优雅的解决方案/概念,但是我很挣扎。

这是我的尝试,目前还不行。

def flattenColumn(df, column):
    '''column is a string of the column's name.
    for each value of the column's element (which might be a list), duplicate the rest of columns at the correspdonding row with the (each) value.
    '''
    def duplicate_if_needed(row):
        return concat([concat([row.drop(column, axis = 1), DataFrame({column: each})], axis = 1) for each in row[column][0]])
    return df.groupby(df.index).transform(duplicate_if_needed)

认识到alko的帮助,这是我对该解决方案的简单概括,以处理一个数据帧中的多于2列的问题:

def flattenColumn(input, column):
    '''
    column is a string of the column's name.
    for each value of the column's element (which might be a list),
    duplicate the rest of columns at the corresponding row with the (each) value.
    '''
    column_flat = pandas.DataFrame(
        [
            [i, c_flattened]
            for i, y in input[column].apply(list).iteritems()
            for c_flattened in y
        ],
        columns=['I', column]
    )
    column_flat = column_flat.set_index('I')
    return (
        input.drop(column, 1)
             .merge(column_flat, left_index=True, right_index=True)
    )

目前唯一的限制是列的顺序已更改,列展平将在最右边,而不是在其原始位置。进行修复应该是可行的。


问题答案:

我猜想平坦列表列表的简单方法是纯python代码,因为此对象类型不太适合熊猫或numpy。所以你可以用例如

>>> b_flat = pd.DataFrame([[i, x] 
...               for i, y in input['B'].apply(list).iteritems() 
...                    for x in y], columns=list('IB'))
>>> b_flat = b_flat.set_index('I')

将B列展平,您可以将其合并回去:

>>> input[['A']].merge(b_flat, left_index=True, right_index=True)
   A  B
0  1  a
0  1  b
1  2  c

[3 rows x 2 columns]

如果希望按照预期结果重新创建索引,则可以添加.reset_index(drop=True)到最后一个命令。



 类似资料:
  • 问题内容: 我有一个这样的Pandas DataFrame: 我只想在值等于0的情况下用第二列()中的值替换值,然后(对于剩余的零值),再次使用第三列()进行替换。期望的结果是下一个: 我使用该函数完成了此操作,但它似乎太慢了。我认为这一定是一种更快的方法。 使用其他功能而不是该功能,有没有更快的方法呢? 问题答案: 使用起来更快。使用与您使用类似的模式: 但是,使用嵌套稍微快一点: 时机 使用以

  • 问题内容: 如何将值从一列复制到另一列?我有: 我希望有: 我应该有哪些mysql查询? 问题答案: 有关代码的简短答案是: 这是表名,周围是重音符号(又称“-”),因为这是MySQL惯例,用于转义关键字(在这种情况下为关键字)。 请注意,这是非常危险的查询,它将擦除表每行中列中的所有内容,并替换为(无论其值如何) 使用子句将查询限制为仅特定的行集更为常见:

  • Hi StackOverFlow成员 reports=表名。 数据库 这是数据库表: 我想 当我运行这段代码时.. 它返回AllTotal

  • 问题内容: 我需要基于Pandas数据框中的另一列的值来设置一列的值。这是逻辑: 我无法做到这一点,我想要做的就是简单地创建一个具有新值的列(或更改现有列的值:任何一个都对我有用)。 如果我尝试运行上面的代码,或者将其编写为函数并使用apply方法,则会得到以下信息: 问题答案: 一种方法是将索引与配合使用。 例 在没有示例数据框的情况下,我将在此处进行补充: 假设您想 创建一个新列 ,除wher

  • 如何在同一表中从一列插入值到另一列? 说我有: 我要求: 换句话说,我想复制'Suburb2'和'Date',并将它们分别作为新行插入'Date'和'suburban'。 我知道我可以通过首先复制到临时列/s并稍后清理来实现这一点,但我想知道是否有一种方法可以在一个查询中实现这一点? 我试过了 但得到的列“日期”不存在错误。

  • 使用下面的数据集,我希望找到平均速率,同时计算条件和干预中的值在同一行中的次数。 这是我使用的表的一个示例: