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

将pandas DataFrame列扩展为多行

阴礼骞
2023-03-14
问题内容

如果我有DataFrame这样的话:

pd.DataFrame( {"name" : "John", 
               "days" : [[1, 3, 5, 7]]
              })

给出以下结构:

           days  name
0  [1, 3, 5, 7]  John

如何将其扩展到以下内容?

   days  name
0     1  John
1     3  John
2     5  John
3     7  John

问题答案:

您可以df.itertuples用来遍历每一行,并使用列表推导将数据重塑为所需的形式:

import pandas as pd

df = pd.DataFrame( {"name" : ["John", "Eric"], 
               "days" : [[1, 3, 5, 7], [2,4]]})
result = pd.DataFrame([(d, tup.name) for tup in df.itertuples() for d in tup.days])
print(result)

产量

   0     1
0  1  John
1  3  John
2  5  John
3  7  John
4  2  Eric
5  4  Eric

ivakar的解决方案,using_repeat是最快的:

In [48]: %timeit using_repeat(df)
1000 loops, best of 3: 834 µs per loop

In [5]: %timeit using_itertuples(df)
100 loops, best of 3: 3.43 ms per loop

In [7]: %timeit using_apply(df)
1 loop, best of 3: 379 ms per loop

In [8]: %timeit using_append(df)
1 loop, best of 3: 3.59 s per loop

这是用于上述基准测试的设置:

import numpy as np
import pandas as pd

N = 10**3
df = pd.DataFrame( {"name" : np.random.choice(list('ABCD'), size=N), 
                    "days" : [np.random.randint(10, size=np.random.randint(5))
                              for i in range(N)]})

def using_itertuples(df):
    return  pd.DataFrame([(d, tup.name) for tup in df.itertuples() for d in tup.days])

def using_repeat(df):
    lens = [len(item) for item in df['days']]
    return pd.DataFrame( {"name" : np.repeat(df['name'].values,lens), 
                          "days" : np.concatenate(df['days'].values)})

def using_apply(df):
    return (df.apply(lambda x: pd.Series(x.days), axis=1)
            .stack()
            .reset_index(level=1, drop=1)
            .to_frame('day')
            .join(df['name']))

def using_append(df):
    df2 = pd.DataFrame(columns = df.columns)
    for i,r in df.iterrows():
        for e in r.days:
            new_r = r.copy()
            new_r.days = e
            df2 = df2.append(new_r)
    return df2


 类似资料:
  • 问题内容: 在Postgres 9.3数据库中,我有一张表,其中一列包含JSON,如下面示例中所示的测试表所示。 JSON始终是一个包含可变数量哈希值的数组。每个哈希始终具有相同的键集。我正在尝试编写一个查询,该查询为JSON数组中的每个条目返回一行,并为每个哈希键和Things表中的ID设置列。我希望输出如下所示: 即,两行用于JSON数组中包含两项的条目。是否可以让Postgres做到这一点?

  • 有没有办法在presto中有效地将行扩展为列? 我尝试用“where team=1”和“where team=2”分别过滤原始数据集,首先相应地获得dataset1和DataSet2,然后在income_level上连接这两个数据集。然而,当income_level有太多不同的值时,这是不方便的。有没有什么高效的方法可以得到我想要的结果?

  • 问题内容: 我有一个表,我试图根据第二列的值将每一行分成一个或多个行。像这样: 我将其编写为SQL Server 2008中的sproc。我最好的解决方案是使用游标并向临时表中为表中的每一行添加[pcs]行数。似乎必须有一个比我所缺少的解决方案更简单的解决方案。谢谢。 问题答案: 您可以使用递归CTE: 这是一个演示供您尝试。

  • 问题内容: 我有一个SQL选择如下: 实际中 在这个 更复杂的选择中。是字符串(varchar)。如何扩展该sql以从中选择行, 就像 文本来自(而不是完全等于)? 问题答案: 如果您在表2的文本列中有通配符表达式,则可以这样做。 否则,您需要在查询中添加。

  • Szenario:我有两个扩展,它们用一些特定字段扩展了。在TYPO3 9之前,我必须使用以下打字脚本配置对新闻扩展的依赖关系进行配置: 模型扩展了基本扩展的模型: 在TYPO3 10中,在(中断:#87623): 只要您只有一个扩展新闻扩展名的扩展名,它就可以工作多久。如果您有第二个扩展并启用TYPO3缓存,您将得到一个错误,即在第一个扩展中添加的字段在新闻扩展的模板中不可用。奇怪的是,这个问题

  • 问题内容: 我有一张只包含产品ID和类别ID的表(产品可以在多个类别中)。如何将类别ID展平到产品列中,所以我以此结束: 就像我需要循环到类别列的单独表中一样。我该怎么办?或者有更好的方法吗? 问题答案: 在MSSQL中没有内置的方法可以做到这一点。 在Microsoft SQL Server 2005中模拟group_concat MySQL函数? 很好地描述了如何实施变通办法。