簡體   English   中英

按列值復制 Pandas 數據框中的行

[英]Replicating rows in a pandas data frame by a column value

我想復制 Pandas Dataframe 中的行。 每行應重復 n 次,其中 n 是每行的一個字段。

import pandas as pd

what_i_have = pd.DataFrame(data={
  'id': ['A', 'B', 'C'],
  'n' : [  1,   2,   3],
  'v' : [ 10,  13,   8]
})

what_i_want = pd.DataFrame(data={
  'id': ['A', 'B', 'B', 'C', 'C', 'C'],
  'v' : [ 10,  13,  13,   8,   8,   8]
})

這可能嗎?

您可以使用np.repeat獲取重復索引,然后使用它來索引框架:

>>> df2 = df.loc[np.repeat(df.index.values,df.n)]
>>> df2
  id  n   v
0  A  1  10
1  B  2  13
1  B  2  13
2  C  3   8
2  C  3   8
2  C  3   8

之后,只需進行一些清理工作:

>>> df2 = df2.drop("n",axis=1).reset_index(drop=True)
>>> df2
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

請注意,如果您可能需要擔心重復索引,則可以使用.iloc代替:

In [86]: df.iloc[np.repeat(np.arange(len(df)), df["n"])].drop("n", axis=1).reset_index(drop=True)
Out[86]: 
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

它使用位置,而不是索引標簽。

您可以使用set_indexrepeat

In [1057]: df.set_index(['id'])['v'].repeat(df['n']).reset_index()
Out[1057]:
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

細節

In [1058]: df
Out[1058]:
  id  n   v
0  A  1  10
1  B  2  13
2  C  3   8

不是最好的解決方案,但我想分享這個:你也可以使用pandas.reindex().repeat()

df.reindex(df.index.repeat(df.n)).drop('n', axis=1)

輸出:


   id   v
0   A   10
1   B   13
1   B   13
2   C   8
2   C   8
2   C   8

您可以進一步附加.reset_index(drop=True)以重置.index

這類似於uncount中的tidyr

https://tidyr.tidyverse.org/reference/uncount.html

我寫了一個實現這個 API 的包( https://github.com/pwwang/datar ):

from datar import f
from datar.tibble import tribble
from datar.tidyr import uncount

what_i_have = tribble(
    f.id, f.n, f.v,
    'A',  1,   10,
    'B',  2,   13,
    'C',  3,   8
)
what_i_have >> uncount(f.n)

輸出:

  id   v
0  A  10
1  B  13
1  B  13
2  C   8
2  C   8
2  C   8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM