基于索引复制行乘以行而不是复制

Replicating rows based on index multiplies the rows instead of replicating

我有数据框,我想在其中复制几行:

         X      Y       diff        No
Index                              
1d       0.000   0.017  0.000e+00   0
2D       0.083   0.017  3.000e-03   1
3D       0.250   0.017  7.200e-03   2
6D       0.500   0.019  2.400e-03   3
1DD      1.000   0.020  2.400e-03   4
2DD      2.000   0.023  1.300e-03   5
3DD      3.000   0.024  1.000e-03   6
5DD      5.000   0.026  6.500e-04   7
7DD      7.000   0.027  2.667e-04   8
10DD     10.000  0.028  1.200e-04   9
20DD     20.000  0.029  1.200e-04   10
30DD     30.000  0.031  0.000e+00   11

我想用相同的索引名称复制 30DD 30 次、20DD 20 次和 10DD 10 次。

我试过这个,而不是复制它乘以

for i in range(4):
    test1 = df.append(df.ix['30DD']*30)

      X      Y       diff        No
Index                              
1d       0.000   0.017  0.000e+00   0
2D       0.083   0.017  3.000e-03   1
3D       0.250   0.017  7.200e-03   2
6D       0.500   0.019  2.400e-03   3
1DD      1.000   0.020  2.400e-03   4
2DD      2.000   0.023  1.300e-03   5
3DD      3.000   0.024  1.000e-03   6
5DD      5.000   0.026  6.500e-04   7
7DD      7.000   0.027  2.667e-04   8
10DD     10.000  0.028  1.200e-04   9
20DD     20.000  0.029  1.200e-04   10
30DD     30.000  0.031  0.000e+00   11
30DD     900     0.918  0           330

添加新行,但减去 1,因为 append 到原始 DataFrame:

vals = ['30DD'] * 29 + ['20DD'] * 19 + ['10DD'] * 9
df = df.append(df.loc[vals])

最后如果要按索引值的数量对值进行排序:

df = df.iloc[df.index.str.extract('(\d+)').astype(int).squeeze().argsort()]

使用 numpy.repeat, you can create a list of indices for rows you wish to append. Then feed to pd.DataFrame.loc 并附加到您的原始数据框。

vals = ['30DD', '20DD', '10DD']
counts = [30, 20, 10]

df = df.append(df.loc[np.repeat(vals, counts)])