Pandas从每个现有行创建新行

jpfvwuh4  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(108)

一个短的数据框,我想从现有的行创建新行。
它现在做的是,每行,每列乘以3到5之间的随机数:

import pandas as pd
import random

data = {'Price': [59,98,79],
'Stock': [53,60,60],
'Delivery': [11,7,6]}
df = pd.DataFrame(data)

for row in range(df.shape[0]):
    new_row = round(df.loc[row] * random.randint(3,5))
    new_row.name = 'new row'
    df = df.append([new_row])

print (df)


         Price  Stock  Delivery
0           59     53        11
1           98     60         7
2           79     60         6
new row    295    265        55
new row    294    180        21
new row    316    240        24

有没有可能每一行都有多个不同的随机数?例如:

the 1st row 3 cells multiple (random) [3,4,5]
the 2nd row 3 cells multiple (random) [4,4,3] etc?
bxfogqkk

bxfogqkk1#

在for循环中将random更改为numpyrandom.choice

np.random.choice(range(3,5),3)
n1bvdmb6

n1bvdmb62#

使用np.random.randint(3,6, size=3)。实际上,你可以立即做到:

df * np.random.randint(3,6, size=df.shape)
wj8zmpe1

wj8zmpe13#

你也可以独立地生成与df形状相同的乘法系数,然后将按元素相乘的df * mul与原始df合并:
注意:这种方法避免了众所周知的慢.append()。基准测试:使用此方法几乎可以立即完成10,000行,而.append()需要40秒!

import numpy as np
np.random.seed(111)  # reproducibility

mul = np.random.randint(3, 6, df.shape)  # 6 not inclusive
df_new = pd.concat([df, df * mul], axis=0).reset_index(drop=True)

输出:

print(df_new)
   Price  Stock  Delivery
0     59     53        11
1     98     60         7
2     79     60         6
3    177    159        33
4    294    300        28
5    395    300        30

print(mul)  # check the coefficients
array([[3, 3, 3],
       [3, 5, 4],
       [5, 5, 5]])

相关问题