[英]Pandas df change the value of a row in one column based on a value in a dictionary matching a row in a different column
Pandas DataFrame
s 有一個replace
方法來完成這個操作:
import pandas as pd
df = pd.DataFrame(data={'a': [1, 2, 3], 'b': [100, 200, 300]})
rename_dict = {100: 1000, 200: 2000}
df['b'].replace(rename_dict, inplace=True)
print(df)
這導致:
a b
0 1 1000
1 2 2000
2 3 300
如果您希望返回副本,則可以省略inplace=True
。
我不確定你想做什么,我寫了代碼,如果一行有一個 sic_code 對應於 comp_dict 的鍵,則 sic_code 更改為 comp_dict 的對應值。 告訴我我是否弄錯了。 對於循環,我寧願迭代 dataframe 而不是字典。 例如,通過使用iterrows和iloc ,一個簡單的循環可能如下所示:
for index, row in df.iterrows():
sic_code = row['sic_code']
if sic_code in comp_dict.keys():
df.iloc[index, <index of column sic_code>] = comp_dict[sic_code]
在這里,如果您的 dict 包含 {2834: 3000},則所有 sic_code 值為 2834 的行都將更改為 30000。
這是解決問題的兩步方法。 首先,找到存在於 code-to-sic 代碼字典中的數據框條目。 其次,使用.map()
function 更新 sic 代碼:
df = (pd.DataFrame(
{'code': [1611787, 170846, 142529],
'name': ['Advanced', 'Perth', 'ATA Creativity'],
'sic_code': [2834, 6221, 8200]})
.set_index('code')
)
# key is `code`; value is `sic_code`
comp_dict = {1611787: 3000}
# find data frame entries such that `code` is in the dictionary
mask = df.index.isin(comp_dict)
# update `sic_code`
df.loc[mask, 'sic_code'] = df.index[mask].map(comp_dict)
df
生成的數據框是:
name sic_code
code
1611787 Advanced 3000
170846 Perth 6221
142529 ATA Creativity 8200
我讓它按我想要的方式工作,但我不知道它是否最有效。
for index, row in df.iterrows():
print(row['code'], row['sic_code'])
for key in comp_dict:
# print(key)
if row['code'] == key:
df['sic_code'][index] = comp_dict[key]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.