![](/img/trans.png)
[英]How to expand a list in a pandas dataframe without repeating other column values
[英]“Expand” pandas dataframe by values in column
假設我從一個包含一些數據和一列數量的數據框開始:
In: df=pd.DataFrame({'first-name':['Jan','Leilani'],'Qty':[2,4]})
Out: Qty first-name
2 Jan
4 Leilani
我想創建一個數據幀,將數據復制並標記為新行,其次數等於每行的數量。 這是輸出應該是什么樣子:
Qty first-name position
2 Jan 1
2 Jan 2
4 Leilani 1
4 Leilani 2
4 Leilani 3
4 Leilani 4
我可以使用python這樣做:
l=[]
x=0
for idx in df.index:
x=0
for _ in range(df.loc[idx]['Qty']):
x+=1
tempSrs=df.loc[idx]
tempSrs['position']=x
l.append(tempSrs)
outDf=pd.DataFrame(l)
這很慢。 有沒有辦法使用pandas功能? 這實際上是一個“不透明”,在熊貓中是“融化”,但我無法弄清楚如何使用融化功能來實現這一目標。
謝謝,
隨着repeat
和cumcount
Newdf=df.reindex(df.index.repeat(df.Qty))
Newdf['position']=Newdf.groupby(level=0).cumcount()+1
Newdf
Out[931]:
Qty first-name position
0 2 jan 1
0 2 jan 2
1 4 jay 1
1 4 jay 2
1 4 jay 3
1 4 jay 4
不同之處是:
loc
而不是reindex
(同樣的事情) assign
而不是=
賦值( assign
生成副本) lambda
到assign
嵌入groupby
邏輯 df.loc[df.index.repeat(df.Qty)].assign(
position=lambda d: d.groupby('first-name').cumcount() + 1
)
Qty first-name position
0 2 jan 1
0 2 jan 2
1 4 jay 1
1 4 jay 2
1 4 jay 3
1 4 jay 4
np.arange
q = df.Qty.values
r = np.arange(q.sum()) - np.append(0, q[:-1]).cumsum().repeat(q) + 1
df.loc[df.index.repeat(q)].assign(position=r)
Qty first-name position
0 2 jan 1
0 2 jan 2
1 4 jay 1
1 4 jay 2
1 4 jay 3
1 4 jay 4
這是使用numpy.repeat
和itertools.chain
的直觀方式。
對於較大的數據幀,這可能比可pandorable
方法更有效。
import pandas as pd
import numpy as np
from itertools import chain
df = pd.DataFrame({'first-name':['jan','jay'],'Qty':[2,4]})
lens = df['Qty'].values
res = pd.DataFrame({'Qty': np.repeat(df['Qty'], lens),
'first-name': np.repeat(df['first-name'], lens),
'Count': list(chain.from_iterable(range(1, i+1) for i in lens))})
print(res)
Count Qty first-name
0 1 2 jan
0 2 2 jan
1 1 4 jay
1 2 4 jay
1 3 4 jay
1 4 4 jay
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.