[英]Python Pandas: Assign particular value of Group to All Entries of That Group in dataframe
[英]Python Pandas: Assign Last Value of DataFrame Group to All Entries of That Group
在 Python Pandas 中,我有一個 DataFrame。 我按列對這個 DataFrame 進行分組,並希望將一列的最后一個值分配給另一列的所有行。
我知道我可以通過以下命令選擇組的最后一行:
import pandas as pd
df = pd.DataFrame({'a': (1,1,2,3,3), 'b':(20,21,30,40,41)})
print(df)
print("-")
result = df.groupby('a').nth(-1)
print(result)
結果:
a b
0 1 20
1 1 21
2 2 30
3 3 40
4 3 41
-
b
a
1 21
2 30
3 41
怎么可能將此操作的結果分配回原始數據幀,以便我有類似的東西:
a b b_new
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
df['b_new'] = df.groupby('a')['b'].transform('last')
選擇:
df['b_new'] = df.groupby('a')['b'].transform(lambda x: x.iat[-1])
print(df)
a b b_new
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
df = df.join(df.groupby('a')['b'].nth(-1).rename('b_new'), 'a')
print(df)
a b b_new
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
時間:
N = 10000
df = pd.DataFrame({'a':np.random.randint(1000,size=N),
'b':np.random.randint(10000,size=N)})
#print (df)
def f(df):
return df.join(df.groupby('a')['b'].nth(-1).rename('b_new'), 'a')
#cᴏʟᴅsᴘᴇᴇᴅ1
In [211]: %timeit df['b_new'] = df.a.map(df.groupby('a').b.nth(-1))
100 loops, best of 3: 3.57 ms per loop
#cᴏʟᴅsᴘᴇᴇᴅ2
In [212]: %timeit df['b_new'] = df.a.replace(df.groupby('a').b.nth(-1))
10 loops, best of 3: 71.3 ms per loop
#jezrael1
In [213]: %timeit df['b_new'] = df.groupby('a')['b'].transform('last')
1000 loops, best of 3: 1.82 ms per loop
#jezrael2
In [214]: %timeit df['b_new'] = df.groupby('a')['b'].transform(lambda x: x.iat[-1])
10 loops, best of 3: 178 ms per loop
#jezrael3
In [219]: %timeit f(df)
100 loops, best of 3: 3.63 ms per loop
警告
考慮到組的數量,結果並未解決性能問題,這將對其中一些解決方案的時間產生很大影響。
兩種可能,用groupby
+ nth
+ map
或者replace
df['b_new'] = df.a.map(df.groupby('a').b.nth(-1))
或者,
df['b_new'] = df.a.replace(df.groupby('a').b.nth(-1))
您還可以將nth(-1)
替換為last()
(實際上,這樣做會使其速度更快一些),但是nth
使您可以更靈活地從b
每個組中選擇哪些項目。
df
a b b_new
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
我認為這應該很快
df.merge(df.drop_duplicates('a',keep='last'),on='a',how='left')
Out[797]:
a b_x b_y
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.