Har*_*sha 10 python numpy dataframe pandas
我有一个数据框df如下:
| ID | 高球 | 地址 | 地址2 |
|---|---|---|---|
| a1 | 001 | 1234 | 0 |
| a1 | 001 | 1233 | 0 |
| a3 | 003 | 1221 | 0 |
| a4 | 009 | 1234 | 0 |
我想为n每个 id生成(让我们取 4)行,其他列是null/na/nan值。因此,上表要转换为:
| ID | 高球 | 地址 | 地址2 |
|---|---|---|---|
| a1 | 001 | 1234 | 0 |
| a1 | 001 | 1233 | 0 |
| a1 | 001 | 呐 | 呐 |
| a1 | 呐 | 呐 | 呐 |
| a3 | 003 | 1221 | 0 |
| a3 | 呐 | 呐 | 呐 |
| a3 | 呐 | 呐 | 呐 |
| a3 | 呐 | 呐 | 呐 |
| a4 | 009 | 1234 | 0 |
| a4 | 呐 | 呐 | 呐 |
| a4 | 呐 | 呐 | 呐 |
| a4 | 呐 | 呐 | 呐 |
我怎样才能做到这一点?在执行时,我将有 500-700 个 id,n 始终为 70(因此每个 id 应该有 70 行)。
我想创建一个循环来创建一行,按 id 做一个组,看看它是否小于 70 并重复这个过程,但它最终会做很多不必要的操作。
这是使用 Counter 计算每个 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")
Run Code Online (Sandbox Code Playgroud)
您可以枚举idthen、trystack/unstack或 中的行pivot:
(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')
)
Run Code Online (Sandbox Code Playgroud)