每个id创建n行|个

2024-04-18 19:56:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df,如下所示:

^{tb1}$

我想为每个id生成n(让我们取4)行,其他列为null/na/nan值。 因此,将上表转换为:

^{tb2}$

我怎样才能做到这一点?在执行时,我将有500-700个id,n始终是70(因此每个id应该有70行)

我想创建一个循环,创建一行,按id分组,看看是否小于70,然后重复这个过程,但最终会执行很多不必要的操作


Tags: 数据iddf过程nannullnatb2
3条回答

您可以枚举id中的行,然后尝试stack/unstackpivot

(df.assign(enum=df.groupby('id').cumcount())
   .query('enum <4')
   .set_index(['enum','id'])
   .unstack('id')
   .reindex(range(4))
   .stack('id',dropna=False)
   .sort_index(level='id')
   .reset_index('id')
)

下面是一个解决方案,使用计数器计算每个ID需要多少额外的行,然后添加新数据:

from collections import Counter
id_count = Counter(df['id'])
# Create lists of each id repeated the number of times each is needed:
n = 4
id_values = [[i] * (n - id_count[i]) for i in id_count.keys()]
# Flatten to a single list:
id_values = [i for s in id_values for i in s]
# Create as new DataFrame and append to existing data:
new_data = pd.DataFrame({"id": id_values})
df = df.append(new_data).sort_values(by="id")

您可以使用Pandas中的concat函数来优化运行时间,代码可以如下所示:

import pandas as pd
def replication(n, table):
        cols = [x in table.columns]
        empty_tab = table.copy()
        for x in cols:
            if x != 'ID':
                empty_tab[x] = np.nan
        for x in range(n):
                table = pd.concat([table, empty_tab.copy()], columns = cols) 
        return table

在这种情况下,第二个副本()实际上不是必需的

相关问题 更多 >