[英]Pandas set column value based on matching row value and column name
我有一個看起來像這樣的數據框
start end 2017-06-08 2018-04-08 2019-04-20
2018-04-20 2019-04-20 NaN NaN NaN
2018-04-20 2019-04-20 NaN NaN NaN
2017-06-08 2018-04-08 NaN NaN NaN
我需要讓它像這樣
start end 2017-06-08 2018-04-20 2019-04-20
2018-04-20 2019-04-20 NaN 1 1
2018-04-20 2019-04-20 NaN 1 1
2017-06-08 2018-04-08 1 1 NaN
這意味着我將更改匹配列名的行值。
更改匹配列名的行值
如果您想匹配開始列和結束列中的列名,這是我的方法:
m=(df.stack().reset_index(level=1)
.set_index(0,append=True)['level_1'].unstack(fill_value=0).astype(bool)*1)
df.update(m)
print(df)
start end 2017-06-08 2018-04-20 2018-04-08 2019-04-20
0 2018-04-20 2019-04-20 0.0 1.0 0.0 1.0
1 2018-04-20 2019-04-20 0.0 1.0 0.0 1.0
2 2017-06-08 2018-04-08 1.0 0.0 1.0 0.0
一種方法來melt
先進行比較,該pivot
回來
s=df.reset_index().melt(['index','start','end'])
s['value']=s.variable.between(s.start,s.end).astype(int)
yourdf=s.pivot_table(index=['index','start','end'],columns='variable',values='value',aggfunc='first').reset_index(level=[1,2])
yourdf
variable start end ... 2018-04-20 2019-04-20
index ...
0 2018-04-20 2019-04-20 ... 1 1
1 2018-04-20 2019-04-20 ... 1 1
2 2017-06-08 2018-04-08 ... 0 0
[3 rows x 6 columns]
IUC:
for col in df.columns[2:]:
df[col] = np.where((df.start==col)|(df.end==col),1,np.nan)
輸出:
0 start end 2017-06-08 2018-04-20 2018-04-08 2019-04-20
1 2018-04-20 2019-04-20 NaN 1.0 NaN 1.0
2 2018-04-20 2019-04-20 NaN 1.0 NaN 1.0
3 2017-06-08 2018-04-08 1.0 NaN 1.0 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.