根据条件扩展/复制数据帧行

时间:2018-01-26 16:32:06

标签: python-3.x pandas numpy dataframe

我是最近开始使用Python 3进行数据管理的R用户。我正在努力根据条件扩展/复制数据框行。我还需要能够以可变的方式扩展行。我将用这个例子来说明。

我有这些数据:

df = pd.DataFrame([[1, 10], [1,15], [2,10], [2, 15], [2, 20], [3, 10], [3, 15]], columns = ['id', 'var'])


df
Out[6]: 
   id  var
0   1   10
1   1   15
2   2   10
3   2   15
4   2   20
5   3   10
6   3   15

我想扩展ID == 1和ID == 3的行。我还想扩展每个ID == 1行,每行1个重复,我想扩展每个ID == 3行每个重复两次。结果如下:

 df2
Out[8]: 
    id  var
0    1   10
1    1   10
2    1   15
3    1   15
4    2   10
5    2   15
6    2   20
7    3   10
8    3   10
9    3   10
10   3   15
11   3   15
12   3   15
13   3   15

我一直在尝试使用np.repeat,但我没有想到一种可以同时使用ID条件和变量复制数的方法。索引排序在这里无关紧要,只是行被正确复制。如果这是一个简单的问题,我会提前道歉。在此先感谢您的帮助,并随时提出澄清问题。

2 个答案:

答案 0 :(得分:1)

这应该这样做:

dup = {1: 1, 3:2} #what value and how much to add

res = df.copy()

for k, v in dup.items():
    for i in range(v):
        res = res.append(df.loc[df['id']==k], ignore_index=True)
res.sort_values(['id', 'var'], inplace=True)
res.reset_index(inplace=True, drop=True)
res
#    id  var
#0    1   10
#1    1   10
#2    1   15
#3    1   15
#4    2   10
#5    2   15
#6    2   20
#7    3   10
#8    3   10
#9    3   10
#10   3   15
#11   3   15
#12   3   15

P.S。您所需的解决方案的7值为id 3,而您的描述意味着6值。

答案 1 :(得分:1)

我认为下面的代码可以完成你的工作:

df_1=df.loc[df.id==1]
df_3=df.loc[df.id==3]
df1=df.append([df_1]*1,ignore_index=True)
df1.append([df_3]*2,ignore_index=True).sort_values(by='id')

    id  var
0   1   10
1   1   15
7   1   10
8   1   15
2   2   10
3   2   15
4   2   20
5   3   10
6   3   15
9   3   10
10  3   15
11  3   10
12  3   15