【问题标题】:Pandas row replication python熊猫行复制python
【发布时间】:2021-09-17 13:31:32
【问题描述】:

所以我的数据框有多个列,其中一个名为“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

【问题讨论】:

  • df[df.multiple==1]新建一个df并用pd.concat()添加4次
  • 但这不会保持顺序。例如,如果索引 25 的 df.multiple=1,那么我需要按顺序将 25 复制到 26、27、28、29
  • 请提供示例输入和匹配的预期输出以明确说明。
  • @mozway 我已经编辑并添加了示例输入和预期输出

标签: python pandas replicate


【解决方案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

【讨论】:

  • 不得不说这个方案比我的快
  • @mozway 是的 apply 基本上是一个循环。而且 pandas 往往比 numpy 更慢(开销更大)..
  • 根据您的回答,这里是另一种选择:df.apply(lambda x: np.repeat(x, df['multiple']*4+1)).reset_index(drop=True)。不过仍然没有你的那么快。
【解决方案2】:

你可以用熊猫来做:

(df.groupby('multiple')
   .apply(lambda x: pd.concat([x]*4) if x.name else x)
   .droplevel(level=0)
   .sort_index()
   .reset_index(drop=True)
)

【讨论】:

    【解决方案3】:

    这是基于@Vinzent 回答的另一种选择。 它使用相同的方法来构建重复,但不需要重建完整的数据帧。相反,它基于索引。在提供的数据集和更大的数据集上,此解决方案的速度提高了约 30%。

    df.loc[np.repeat(df.multiple, df.multiple.values*4+1).index].reset_index(drop=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多