有没有办法替换数据框中的列?
Is there a way to replace columns in dataframes?
*我根据收到的答案稍微编辑了问题!
这是我的第一个数据框。实际上,它有超过 30K 列 = df
cl_id
gained_from_sup
lost_to_sup
fixed_term
1001
3
5
NaN
1002
1
1
NaN
1003
4
2
12
1004
1
3
6
这是我的第二个数据框,它有供应商 ID - 这与从 Sup 获得并丢失到 Sup 的数字匹配到相应的供应商名称 = df_supp
supplier_id
supplier_name
1
KFC
2
Costa
3
Nandos
4
Starbucks
5
Burger King
在使用 pd.merge 合并它们之后,如何“左”,左上获得自……右上 supp Id..
输出第一个df_supp的df到最后。它确实与键正确匹配但是有没有办法用 df2 中的名称替换 df 中的 iDS 因为 table 在 2 列时没有意义(gained_from 和 lost_from in df1合并时的 supp_id 只匹配上获得的
这是我想要的输出:
cl_id
gained_from_sup
lost_to_sup
fixed_term
1001
Nandos
Burger King.
NaN
1002
KFC
KFC.
NaN
1003
Starbucks
Costa.
12
1004
KFC
Nandos.
6
或者是否有更好的方法来重新格式化 table 以显示 gained_from_sup 和 lost_from_sup 的相应 ID 和名称?
DataFrame.replace
df1.replace(df2.set_index('supplier_id')['supplier_name'])
如果您只想在列的子集中执行替换:
cols = ['gained_from_sup', 'lost_to_sup']
df1.assign(**df1[cols].replace(df2.set_index('supplier_id')['supplier_name']))
cl_id gained_from_sup lost_to_sup
0 1001 Nandos Burger King
1 1002 KFC KFC
2 1003 Starbucks Costa
3 1004 KFC Nandos
你可以在这里使用map
,创建df_supp
:
的字典
df["gained_from_sup"] = df["gained_from_sup"].map(df_supp.set_index("supplier_id")["supplier_name"].to_dict())
df["lost_to_sup"] = df["lost_to_sup"].map(df_supp.set_index("supplier_id")["supplier_name"].to_dict())
# setup
import pandas as pd
import numpy as np
df = pd.DataFrame({'cl_id' : [1001, 1002, 1003, 1004], 'gained_from_sup': [3, 1, 4, 1], 'lost_to_sup': [5, 1, 2, np.nan], 'fixed_term': [np.nan, np.nan, 12,6]})
df_supp = pd.DataFrame({'supplier_id': [1, 2, 3, 4, 5], 'supplier_name': ['KFC', 'Costa', 'Nandos', 'Starbucks', 'Burger King']})
# first merge
intermediate = df.merge(df_supp, left_on='gained_from_sup', right_on='supplier_id', how='left').drop(columns=['gained_from_sup', 'supplier_id'])
intermediate = intermediate.rename(columns= {'supplier_name': 'gained_from_sup'})
# second merge
final = intermediate.merge(df_supp, left_on='lost_to_sup', right_on='supplier_id', how='left').drop(columns=['lost_to_sup', 'supplier_id'])
final = final.rename(columns= {'supplier_name': 'lost_from_sup'})
# display result
final
将第二个数据帧转换为字典然后映射它的最佳方法。
cols = ['gained_from_sup', 'lost_to_sup']
lookup_name = df2.set_index('supplier_id')['supplier_name'].to_dict()
df1[cols] = df1[cols].replace(lookup_name)
不选择列的另一种方法
lookup_name = df2.set_index('supplier_id')['supplier_name'].to_dict()
df1 = df1.replace(lookup_name)
*我根据收到的答案稍微编辑了问题!
这是我的第一个数据框。实际上,它有超过 30K 列 = df
cl_id | gained_from_sup | lost_to_sup | fixed_term |
---|---|---|---|
1001 | 3 | 5 | NaN |
1002 | 1 | 1 | NaN |
1003 | 4 | 2 | 12 |
1004 | 1 | 3 | 6 |
这是我的第二个数据框,它有供应商 ID - 这与从 Sup 获得并丢失到 Sup 的数字匹配到相应的供应商名称 = df_supp
supplier_id | supplier_name |
---|---|
1 | KFC |
2 | Costa |
3 | Nandos |
4 | Starbucks |
5 | Burger King |
在使用 pd.merge 合并它们之后,如何“左”,左上获得自……右上 supp Id..
输出第一个df_supp的df到最后。它确实与键正确匹配但是有没有办法用 df2 中的名称替换 df 中的 iDS 因为 table 在 2 列时没有意义(gained_from 和 lost_from in df1合并时的 supp_id 只匹配上获得的
这是我想要的输出:
cl_id | gained_from_sup | lost_to_sup | fixed_term |
---|---|---|---|
1001 | Nandos | Burger King. | NaN |
1002 | KFC | KFC. | NaN |
1003 | Starbucks | Costa. | 12 |
1004 | KFC | Nandos. | 6 |
或者是否有更好的方法来重新格式化 table 以显示 gained_from_sup 和 lost_from_sup 的相应 ID 和名称?
DataFrame.replace
df1.replace(df2.set_index('supplier_id')['supplier_name'])
如果您只想在列的子集中执行替换:
cols = ['gained_from_sup', 'lost_to_sup']
df1.assign(**df1[cols].replace(df2.set_index('supplier_id')['supplier_name']))
cl_id gained_from_sup lost_to_sup
0 1001 Nandos Burger King
1 1002 KFC KFC
2 1003 Starbucks Costa
3 1004 KFC Nandos
你可以在这里使用map
,创建df_supp
:
df["gained_from_sup"] = df["gained_from_sup"].map(df_supp.set_index("supplier_id")["supplier_name"].to_dict())
df["lost_to_sup"] = df["lost_to_sup"].map(df_supp.set_index("supplier_id")["supplier_name"].to_dict())
# setup
import pandas as pd
import numpy as np
df = pd.DataFrame({'cl_id' : [1001, 1002, 1003, 1004], 'gained_from_sup': [3, 1, 4, 1], 'lost_to_sup': [5, 1, 2, np.nan], 'fixed_term': [np.nan, np.nan, 12,6]})
df_supp = pd.DataFrame({'supplier_id': [1, 2, 3, 4, 5], 'supplier_name': ['KFC', 'Costa', 'Nandos', 'Starbucks', 'Burger King']})
# first merge
intermediate = df.merge(df_supp, left_on='gained_from_sup', right_on='supplier_id', how='left').drop(columns=['gained_from_sup', 'supplier_id'])
intermediate = intermediate.rename(columns= {'supplier_name': 'gained_from_sup'})
# second merge
final = intermediate.merge(df_supp, left_on='lost_to_sup', right_on='supplier_id', how='left').drop(columns=['lost_to_sup', 'supplier_id'])
final = final.rename(columns= {'supplier_name': 'lost_from_sup'})
# display result
final
将第二个数据帧转换为字典然后映射它的最佳方法。
cols = ['gained_from_sup', 'lost_to_sup']
lookup_name = df2.set_index('supplier_id')['supplier_name'].to_dict()
df1[cols] = df1[cols].replace(lookup_name)
不选择列的另一种方法
lookup_name = df2.set_index('supplier_id')['supplier_name'].to_dict()
df1 = df1.replace(lookup_name)