簡體   English   中英

在pandas數據幀中組合groupby后創建共享變量

[英]Create share variable after combined groupby in pandas dataframe

我無法描述我的問題,所以我會直接進入它。 這是一些測試數據:

import pandas as pd
df = pd.DataFrame(data={"family":["Smith","Miller","Simpson","Miller","Simpson","Smith","Miller","Simpson","Miller"],
                    "first_name":["Anna","Bart","Lisa","Ida","Paul","Bridget","Harry","Dustin","George"],
                    "shirt_color":["green","yellow","red","yellow","green","red","yellow","red","red"]})

現在我想在我的原始數據框架中創建一個新列,其中包含每個系列的shirt_color份額,因此每一行如家庭米勒和shirt_color黃色都具有相同的值0.75等。

我嘗試了幾種方法,但沒有成功。

df = df.groupby("family").apply(lambda x: x.groupby("shirt_color").apply(lambda x: x.size()/familysize))

這似乎很有希望,但正如你所看到的,我無法再訪問上一個lambda函數中的家庭成員數量。 我還試圖創建一個只有family的groupby對象並遍歷數據幀,按顏色分別對所有數據幀進行分組,但不知怎的,我無法將數據幀放回到最后。

對於數據幀來說,這似乎不是一件非常奇特的事情,所以我確信有一個簡單的方法可以做到這一點,但我沒有想法。

非常感謝您的幫助!

在我看來,你應該避免apply因為這會導致效率低下的Python級循環。 這是使用GroupBy + transform的替代解決方案:

f = df.groupby('family')['first_name'].transform('size')
g = df.groupby(['family', 'shirt_color'])['first_name'].transform('size')

df['ratio'] = g / f

print(df)

    family first_name shirt_color     ratio
0    Smith       Anna       green  0.500000
1   Miller       Bart      yellow  0.750000
2  Simpson       Lisa         red  0.666667
3   Miller        Ida      yellow  0.750000
4  Simpson       Paul       green  0.333333
5    Smith    Bridget         red  0.500000
6   Miller      Harry      yellow  0.750000
7  Simpson     Dustin         red  0.666667
8   Miller     George         red  0.250000

嘗試:

df.groupby('family').apply(lambda g: g.groupby("shirt_color").apply(lambda x: x.size/g.size)).reset_index()

你快到了。 只需使用不同的變量名稱。 通過使用兩個x您可以覆蓋以前的變量,並且無法訪問它

df.groupby("family").apply(lambda s: s.groupby("shirt_color").apply(lambda x: x.size/s.size))

family   shirt_color
Miller   red            0.250000
         yellow         0.750000
Simpson  green          0.333333
         red            0.666667
Smith    green          0.500000
         red            0.500000
dtype: float64

使用value_countsmerge

s = (df.groupby('family').shirt_color
        .value_counts(normalize=True).rename('ratio').reset_index())

    family shirt_color     ratio
0   Miller      yellow  0.750000
1   Miller         red  0.250000
2  Simpson         red  0.666667
3  Simpson       green  0.333333
4    Smith       green  0.500000
5    Smith         red  0.500000

要把它放回到最初的DataFrame中:

df.merge(s)

    family first_name shirt_color     ratio
0    Smith       Anna       green  0.500000
1   Miller       Bart      yellow  0.750000
2   Miller        Ida      yellow  0.750000
3   Miller      Harry      yellow  0.750000
4  Simpson       Lisa         red  0.666667
5  Simpson     Dustin         red  0.666667
6  Simpson       Paul       green  0.333333
7    Smith    Bridget         red  0.500000
8   Miller     George         red  0.250000

暫無
暫無

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

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