我有一个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但我想知道是否有更好的解决方案。
答案 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
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