Pandas复制n行

kninwzqo  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(143)

我有一个dataframe的格式:

UserID      num_attempts
abc123        4
def234        3

我期待以这样一种方式转换它,输出如下

result_col
abc123
abc123
abc123
abc123
def234
def234
def234

本质上是创建一个新的DF,其中有一列,即UserID为每个用户重复num_attempts抱歉,我没有更好的措辞方式......但是否有一个Python的方式来实现这一点?我想避免一个for循环......谢谢!

yzckvree

yzckvree1#

使用splitmulexplode

ser = df["UserID"].str.split(r"\x00").mul(df["num_attempts"]).explode()

感谢 @Corralien,我们使用r"\x00"(* 表示Unicode中的空字符 *)作为正则表达式模式,以潜在地防止在空白处发生拆分。
Ouptut:

0    abc123
0    abc123
0    abc123
0    abc123
1    def234
1    def234
1    def234
dtype: object

如果你需要一个 DataFrame,用途:

(df["UserID"].str.split(r"\x00").mul(df["num_attempts"])
       .explode().reset_index(drop=True).to_frame("result_col"))
bvuwiixz

bvuwiixz2#

另一种可能的解决方案:

pd.Series(
    [[x[0]] * x[1] for x in zip(df['UserID'], df['num_attempts'])], 
    name='result_col').explode()

或者,更简洁地说:

pd.Series([[x[0]] * x[1] for x in zip(*df.values.T)], 
    name='result_col').explode()

输出:

0    abc123
0    abc123
0    abc123
0    abc123
1    def234
1    def234
1    def234
Name: result_col, dtype: object
mgdq6dx1

mgdq6dx13#

在重新索引 Dataframe 之前使用Index.repeat

>>> df['UserID'].reindex(df.index.repeat(df['num_attempts']))
0    abc123
0    abc123
0    abc123
0    abc123
1    def234
1    def234
1    def234
Name: UserID, dtype: object

为了获得预期的结果,请执行以下操作:

out = (df['UserID'].reindex(df.index.repeat(df['num_attempts']))
                   .to_frame('result_col').reset_index(drop=True))
print(out)

# Output
  result_col
0     abc123
1     abc123
2     abc123
3     abc123
4     def234
5     def234
6     def234

另一种方式使用numpy和DataFrame构造函数:

import numpy as np

pd.DataFrame(np.repeat(df['UserID'], df['num_attempts']).tolist(), 
             columns=['result_col'])
print(df)

# Output
  result_col
0     abc123
1     abc123
2     abc123
3     abc123
4     def234
5     def234
6     def234

相关问题