在下面的示例中,最好的分組是什么,以便可以通過在每個組中取第一年并減去當前年份來形成一個新列。例如,在索引為 0 的行中,它將是 NaN,索引為 1 的行 = 1,索引為 2 的行 = 3,索引為 4 的行 = 1,依此類推。
>>> import pandas as pd
>>> df = pd.DataFrame({'id': ['1', '1', '1', '2', '2', '3', '4', '4'],
... 'Year': [2000, 2001, 2003, 2004, 2005, 2002, 2001, 2003]})
>>> print(df)
id Year
0 1 2000
1 1 2001
2 1 2003
3 2 2004
4 2 2005
5 3 2002
6 4 2001
7 4 2003
uj5u.com熱心網友回復:
轉換Year以first獲得第一年 per id,然后從Year列中減去它以獲得差異,最后mask是差異為 的值0:
s = df['Year'] - df.groupby('id')['Year'].transform('first')
df['col'] = s.mask(s == 0)
id Year col
0 1 2000 NaN
1 1 2001 1.0
2 1 2003 3.0
3 2 2004 NaN
4 2 2005 1.0
5 3 2002 NaN
6 4 2001 NaN
7 4 2003 2.0
uj5u.com熱心網友回復:
盡管@Shubham 的回答比我的回答要短,但我想在這里提出另一種方法:
1. 尋找每組的第一個
您需要知道每個組的每個第一個值是什么,因此,您將使用Groupby.first方法:
firsts = df.groupby('id').first()
print(first)
該first變數是具有以下結構的資料框:
Year
id
1 2000
2 2004
3 2002
4 2001
2.查看每組有多少個值
為此,您將使用Groupby.count方法
howmany = df.groupby('id').count().rename(columns={'Year': 'Howmany'})
print(howmany)
該howmany變數是具有以下結構的資料框:
Howmany
id
1 3
2 2
3 1
4 2
3. 創建資訊資料框
資訊將是一個輔助資料框,其中包含有關Year每個組的第一個是什么以及該組有多少值的資訊。你需要使用一個簡單的Dataframe.join方法
information = firsts.join(howmany).reset_index()
print(information)
該information變數是具有以下結構的資料框:
id Year Howmany
0 1 2000 3
1 2 2004 2
2 3 2002 1
3 4 2001 2
4. 使用每組的每個第一個值創建一列
您將創建一個名為的新列col,其中每個組的第Year一個根據值的數量重復。
lists_df = []
for value in information.itertuples():
lists_df.append(pd.DataFrame(data=[value.Year]*value.Howmany))
df['col'] = pd.concat(lists_df).reset_index(drop=True)
到目前為止,我們的df樣子是這樣的:
id Year col
0 1 2000 2000 <--- First value of group 1, it is repeated 3 times because group 1 has 3 values
1 1 2001 2000
2 1 2003 2000
3 2 2004 2004 <--- First value of group 2, it is repeated 2 times because group 2 has 2 values
4 2 2005 2004
5 3 2002 2002
6 4 2001 2001
7 4 2003 2001
您可以意識到該col列恰好具有每個組的第一個值
5. 用于按組Groupby.shift移動col列
所以,如果你這樣做
df.groupby('id')['col'].shift()
然后,您將獲得:
col
0 NaN
1 2000.0
2 2000.0
3 NaN
4 2004.0
5 NaN
6 NaN
7 2001.0
最后,一個簡單的向量化減法就足夠了,在Year和col列之間:
df['col'] = df['Year'] - df.groupby('id')['col'].shift()
所有代碼一起!
firsts = df.groupby('id').first()
howmany = df.groupby('id').count().rename(columns={'Year': 'Howmany'})
information = firsts.join(howmany).reset_index()
lists_df = []
for value in information.itertuples():
lists_df.append(pd.DataFrame(data=[value.Year]*value.Howmany))
df['col'] = pd.concat(lists_df).reset_index(drop=True)
df['col'] = df['Year'] - df.groupby('id')['col'].shift()
print(df)
輸出:
id Year col
0 1 2000 NaN
1 1 2001 1.0
2 1 2003 3.0
3 2 2004 NaN
4 2 2005 1.0
5 3 2002 NaN
6 4 2001 NaN
7 4 2003 2.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/478445.html
