[英]Split a DataFrame row into multiple rows based on integer value in Pandas
[英]Split a pandas dataframe into rows based on an integer column
這不是一個理想的標題,但我不知道如何更好地描述它。
我有一個數據框(df1),想在“雞”列上拆分它,以便:
我需要的輸出是df2,例如:
在“ A”農場中,有5只雞,其中2只雞產了一個雞蛋,因此有2行雞蛋=“ True”且重量= 1,有1行雞蛋=“ False”且重量= 3(沒有產卵的三只雞)。
我想出的代碼很亂,你們能想到一種更干凈的方法嗎? 謝謝!!
#code to create df1:
df1 = pd.DataFrame({'farm':["A","B","C"],"chicken":[5,10,5],"eggs":[2,3,0]})
df1=df1[["farm","chicken","eggs"]]
#code to transform df1 to df2:
df2 = pd.DataFrame()
for i in df1.index:
number_of_trues = df1.iloc[i]["eggs"]
number_of_falses = df1.iloc[i]["chicken"] - number_of_trues
col_farm = [df1.iloc[i]["farm"]]*(number_of_trues+1)
col_egg = ["True"]*number_of_trues + ["False"]*1
col_weight = [1]*number_of_trues + [number_of_falses]
mini_df = pd.DataFrame({"farm":col_farm,"egg":col_egg,"weight":col_weight})
df2=df2.append(mini_df)
df2 = df2[["farm","egg","weight"]]
df2
這是定制的解決方案,通過建立兩個不同的子數據幀,然后concat
回達到預期output.Key方法: repeat
s=pd.DataFrame({'farm':df1.farm.repeat(df1.eggs),'egg':[True]*df1.eggs.sum(),'weight':[1]*df1.eggs.sum()})
t=pd.DataFrame({'farm':df1.farm,'egg':[False]*len(df1.farm),'weight':df1.chicken-df1.eggs})
pd.concat([t,s]).sort_values(['farm','egg'],ascending=[True,False])
Out[847]:
egg farm weight
0 True A 1
0 True A 1
0 False A 3
1 True B 1
1 True B 1
1 True B 1
1 False B 7
2 False C 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.