簡體   English   中英

將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.

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