根据列值复制DataFrame中的行

时间:2019-04-30 17:50:56

标签: python pandas numpy

以下是我正在使用的一组示例数据:

sample_dat = pd.DataFrame(
    np.array([[1,0,1,1,1,5],
              [0,0,0,0,1,3],
              [1,0,0,0,1,1],
              [1,0,0,1,1,1],
              [1,0,0,0,1,1],
              [1,1,0,0,1,1]]),
    columns=['var1','var2','var3','var4','var5','cnt']
)

我需要更改数据,以便根据最后一列中的值重复行。具体来说,我希望它可以根据cnt列中的值进行复制。

我的搜索产生了很多有关融化,分裂和其他内容的信息。我认为我所希望的是非常基本的。另请注意,第一列中可能会有某种ID,可以是整数或字符串。

例如,第一条记录将再重复4次。第二条记录将重复两次。

下面是一个示例示例,显示DataFrame的语法:

sample_dat2 = pd.DataFrame(
    np.array([[1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [0,0,0,0,1,3],
              [0,0,0,0,1,3],
              [0,0,0,0,1,3],
              [1,0,0,0,1,1],
              [1,0,0,1,1,1],
              [1,0,0,0,1,1],
              [1,1,0,0,1,1]]),
    columns=['var1','var2','var3','var4','var5','cnt']
)

3 个答案:

答案 0 :(得分:0)

创建一个空的数据框,然后遍历您的数据,将每行追加到新的数据框x次,其中x是“ cnt”列中的数字。

df =pd.DataFrame()

for index, row in sample_dat.iterrows():
    for x in range(row['cnt']):
        df = df.append(row, ignore_index=True)

输出

>>> df
   cnt  var1  var2  var3  var4  var5
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
2  1.0   1.0   0.0   0.0   0.0   1.0
3  1.0   1.0   0.0   0.0   1.0   1.0
4  1.0   1.0   0.0   0.0   0.0   1.0
5  1.0   1.0   1.0   0.0   0.0   1.0

答案 1 :(得分:0)

我将根据数据帧索引位置使用numpy重复。 然后重置索引。

sample_dat.loc[numpy.repeat(sample_dat.index.values, sample_dat.cnt)].reset_index(drop=True)

结果:

   var1 var2 var3 var4 var5 cnt
0      1    0   1   1   1   5
1      1    0   1   1   1   5
2      1    0   1   1   1   5
3      1    0   1   1   1   5
4      1    0   1   1   1   5
5      0    0   0   0   1   3
6      0    0   0   0   1   3
7      0    0   0   0   1   3
8      1    0   0   0   1   1
9      1    0   0   1   1   1
10     1    0   0   0   1   1
11     1    1   0   0   1   1

答案 2 :(得分:0)

您可以将numpy.repeat与索引一起使用,以从确定重复次数的列中返回一个值数组。

import numpy as np
import pandas as pd

arr = np.array(
    [[1,0,1,1,1,5],
     [0,0,0,0,1,3],
     [1,0,0,0,1,1],
     [1,0,0,1,1,1],
     [1,0,0,0,1,1],
     [1,1,0,0,1,1]]
    )

df = pd.DataFrame(
    np.repeat(arr, arr[:,5], axis=0),
    columns=['var1','var2','var3','var4','var5','cnt']
    )

print(df)
#     var1  var2  var3  var4  var5  cnt
# 0      1     0     1     1     1    5
# 1      1     0     1     1     1    5
# 2      1     0     1     1     1    5
# 3      1     0     1     1     1    5
# 4      1     0     1     1     1    5
# 5      0     0     0     0     1    3
# 6      0     0     0     0     1    3
# 7      0     0     0     0     1    3
# 8      1     0     0     0     1    1
# 9      1     0     0     1     1    1
# 10     1     0     0     0     1    1
# 11     1     1     0     0     1    1