以下是我正在使用的一组示例数据:
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']
)
答案 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