[英]Change the dataframe column values based on unique combination of other columns
我有以下數據框:
df=pd.DataFrame([[1,11,'a'],[2,12,'b'],[1,11,'c'],[3,12,'d'],[3,7,'e'],
[2,12,'f']])
df.columns=['id','code','name']
print(df)
id code name
0 1 11 a
1 2 12 b
2 1 11 c
3 3 12 d
4 3 7 e
5 2 12 f
對於上面的數據框,我希望列'名稱'只有一個值,用於列id
和code
任何唯一組合。 對於eq,行0和2的name
應該相同。 此外,第1行和第5行的name
也應相同。
id code name
0 1 11 a
1 2 12 b
2 1 11 a
3 3 12 d
4 3 7 e
5 2 12 b
請讓我知道如何以編程方式完成此操作。 我有兩個超過100000行進行此操作。
謝謝
讓我們使用groupby
, transform
和first
:
df.assign(name=df.groupby(['id','code'])['name'].transform('first'))
輸出:
id code name
0 1 11 a
1 2 12 b
2 1 11 a
3 3 12 d
4 3 7 e
5 2 12 b
或者你不需要groupby
A=df.sort_values(['id','code','name']).drop_duplicates(['id','code'],keep='first').index
df.loc[~df.index.isin(A),'name']=np.nan
df.sort_values(['id','code','name']).ffill().sort_index()
Out[603]:
id code name
0 1 11 a
1 2 12 b
2 1 11 a
3 3 12 d
4 3 7 e
5 2 12 b
這是使用join
和drop_duplicates
解決問題的另一種方法。 但是,我更喜歡@ ScottBoston的解決方案
cols = ['id', 'code']
df.drop('name', 1).join(df.drop_duplicates(cols).set_index(cols), on=cols)
id code name
0 1 11 a
1 2 12 b
2 1 11 a
3 3 12 d
4 3 7 e
5 2 12 b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.