在pandas中将行拆分为多行

时间:2017-07-03 06:22:54

标签: python pandas

我有一个DataFrame,其格式如下(简化)

a  b  43
a  c  22

我希望以下列方式分开。

a  b  20
a  b  20
a  b  1
a  b  1
a  b  1
a  c  20
a  c  1
a  c  1

我的行数与除以20的行数相同,然后与剩余行数一样多。我有一个解决方案基本上遍历行并填充一个字典,然后可以转换回Dataframe但我想知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以先使用modulo使用floor divison,然后使用numpy.repeat DataFrame创建新的constructor

最后需要numpy.concatenate list comprehension C

a,b = df.C // 20, df.C % 20
#print (a, b)

cols = ['A','B']
df = pd.DataFrame({x: np.repeat(df[x], a + b) for x in cols})
df['C'] = np.concatenate([[20] * x + [1] * y for x,y in zip(a,b)])
print (df)
   A  B   C
0  a  b  20
0  a  b  20
0  a  b   1
0  a  b   1
0  a  b   1
1  a  c  20
1  a  c   1
1  a  c   1

答案 1 :(得分:1)

设置

考虑数据框df

df = pd.DataFrame(dict(A=['a', 'a'], B=['b', 'c'], C=[43, 22]))
df

   A  B   C
0  a  b  43
1  a  c  22

np.divmodnp.repeat

m = np.array([20, 1])
dm = list(zip(*np.divmod(df.C.values, m[0])))
# [(2, 3), (1, 2)]

rep = [sum(x) for x in dm]
new = np.concatenate([m.repeat(x) for x in dm])

df.loc[df.index.repeat(rep)].assign(C=new)

   A  B   C
0  a  b  20
0  a  b  20
0  a  b   1
0  a  b   1
0  a  b   1
1  a  c  20
1  a  c   1
1  a  c   1