[英]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_index
並repeat
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.