[英]Add index of value_counts() to new column for each group in groupby
[英]get specific value in each group and add it as new column in each group
我想要這樣的東西:
數據框:
col1 col2 col3
A 'aa' date1
A 'aa' date2
A 'aa' date3
A 'bb' date4
B 'aa' date5
B 'bb' date6
B 'aa' date7
輸出:
col1 col2 col3 col4
A 'aa' date1 date4
A 'aa' date2 date4
A 'aa' date3 date4
A 'bb' date4 date4
B 'aa' date5 date6
B 'bb' date6 date6
B 'aa' date7 date6
我想按 col1 分組並根據 col2 中的值獲取 col3 並添加一個新列作為 col4 並將其設置為 col3 的這個值
'aa' 和 'bb' 是例子,所以我不能使用排序......我應該將它與一個值進行比較。
嘗試:
df=df.sort_values("col2", ascending=False).set_index("col1")
df["col4"]=df.groupby("col1")["col3"].first()
df=df.reset_index(drop=False)
輸出:
col1 col2 col3 col4
0 A bb date4 date4
1 B bb date6 date6
2 A aa date1 date4
3 A aa date2 date4
4 A aa date3 date4
5 B aa date5 date6
6 B aa date7 date6
編輯IIUC - 從col3
獲取col4
的值,按col1
分組,其中col2=="bb"
嘗試:
df=df.set_index("col1")
df["col4"]=df.loc[df["col2"]=="bb"].groupby("col1")["col3"].first()
df=df.reset_index(drop=False)
如果每組只有一個bb
值,則過濾它們並為新列過濾Series.map
:
s = df[df['col2'].eq('bb')].set_index('col1')['col3']
#if possible multiple values per groups
#s = df[df['col2'].eq('bb')].drop_duplicates('col1').set_index('col1')['col3']
df['col4'] = df['col1'].map(s)
print (df)
col1 col2 col3 col4
0 A aa date1 date4
1 A aa date2 date4
2 A aa date3 date4
3 A bb date4 date4
4 B aa date5 date6
5 B bb date6 date6
6 B aa date7 date6
左連接merge
另一個想法:
df1 = df.loc[df['col2'].eq('bb'),['col1','col3']].rename(columns={'col3':'col4'})
如果每組重復bb
值:
df1 = (df.loc[df['col2'].eq('bb'),['col1','col3']]
.drop_duplicates('col1')
.rename(columns={'col3':'col4'}))
print (df1)
col1 col4
3 A date4
5 B date6
df = df.merge(df1, on='col1', how='left')
print (df)
col1 col2 col3 col4
0 A aa date1 date4
1 A aa date2 date4
2 A aa date3 date4
3 A bb date4 date4
4 B aa date5 date6
5 B bb date6 date6
6 B aa date7 date6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.