Pandas 行复制 python
Pandas row replication python
所以我的数据框有多个列,其中一列名为“multiple”,其中包含布尔值,只有 1 和 0。现在,我只想为所有 df.loc[df.multiple==1] 复制所有行 4 次。我怎样才能做到这一点? (我不想复制索引)
example input:
df=
index strings multiple
0 A 0
1 B 1
2 C 1
3 D 0
4 E 1
Expected output:
index strings multiple
0 A 0
1 B 1
2 B 1
3 B 1
4 B 1
5 B 1
6 C 1
7 C 1
8 C 1
9 C 1
10 C 1
11 D 0
12 E 1
13 E 1
14 E 1
15 E 1
16 E 1
这就是 numpy.repeat 的用途:
import pandas as pd
import numpy as np
df = pd.DataFrame([['A', 0],
['B', 1],
['C', 1],
['D', 0],
['E', 1]],
columns=['strings', 'multiple'])
df = pd.DataFrame(np.repeat(df.values, df['multiple']*4+1, axis=0), columns=df.columns)
print(df)
# strings multiple
# 0 A 0
# 1 B 1
# 2 B 1
# 3 B 1
# 4 B 1
# 5 B 1
# 6 C 1
# 7 C 1
# 8 C 1
# 9 C 1
# 10 C 1
# 11 D 0
# 12 E 1
# 13 E 1
# 14 E 1
# 15 E 1
# 16 E 1
你可以用 pandas:
(df.groupby('multiple')
.apply(lambda x: pd.concat([x]*4) if x.name else x)
.droplevel(level=0)
.sort_index()
.reset_index(drop=True)
)
这是另一种选择,基于@Vinzent 的回答。
它使用相同的方法来构造重复,但不需要重建完整的数据帧。相反,它基于索引。此解决方案在提供的数据集和更大的数据集上快约 30%。
df.loc[np.repeat(df.multiple, df.multiple.values*4+1).index].reset_index(drop=True)
所以我的数据框有多个列,其中一列名为“multiple”,其中包含布尔值,只有 1 和 0。现在,我只想为所有 df.loc[df.multiple==1] 复制所有行 4 次。我怎样才能做到这一点? (我不想复制索引)
example input:
df=
index strings multiple
0 A 0
1 B 1
2 C 1
3 D 0
4 E 1
Expected output:
index strings multiple
0 A 0
1 B 1
2 B 1
3 B 1
4 B 1
5 B 1
6 C 1
7 C 1
8 C 1
9 C 1
10 C 1
11 D 0
12 E 1
13 E 1
14 E 1
15 E 1
16 E 1
这就是 numpy.repeat 的用途:
import pandas as pd
import numpy as np
df = pd.DataFrame([['A', 0],
['B', 1],
['C', 1],
['D', 0],
['E', 1]],
columns=['strings', 'multiple'])
df = pd.DataFrame(np.repeat(df.values, df['multiple']*4+1, axis=0), columns=df.columns)
print(df)
# strings multiple
# 0 A 0
# 1 B 1
# 2 B 1
# 3 B 1
# 4 B 1
# 5 B 1
# 6 C 1
# 7 C 1
# 8 C 1
# 9 C 1
# 10 C 1
# 11 D 0
# 12 E 1
# 13 E 1
# 14 E 1
# 15 E 1
# 16 E 1
你可以用 pandas:
(df.groupby('multiple')
.apply(lambda x: pd.concat([x]*4) if x.name else x)
.droplevel(level=0)
.sort_index()
.reset_index(drop=True)
)
这是另一种选择,基于@Vinzent 的回答。 它使用相同的方法来构造重复,但不需要重建完整的数据帧。相反,它基于索引。此解决方案在提供的数据集和更大的数据集上快约 30%。
df.loc[np.repeat(df.multiple, df.multiple.values*4+1).index].reset_index(drop=True)