我有这个DataFrame
Person Salary
John 350
Peter 543
Susan 517
Carl 448
还有另一个数据框,其中包含我必须对第一个数据框进行的更改
Attribute Change
Person 3
Salary 2
“更改” 的值应表示更改另一个字母(例如“ x”)显示的金额。结果应如下所示:
Person Salary
Jxxx 3xx
Pexxx 5xx
Suxxx 5xx
Cxxx 4xx
我该怎么办?
答案 0 :(得分:1)
数据:
import pandas as pd
df = pd.DataFrame({'Person':['John', 'Peter', 'Susan','Carl'],
'Salary':[350,543,517,448]})
change_df = pd.DataFrame({'Attribute':['Person', 'Salary'],
'Change':['3','2']})
解决方案:
for col in df.columns:
k = int(change_df[change_df.Attribute == col].Change)
df[col] = df[col].apply(lambda x: str(x)[:len(str(x))-k]+k*'x')
结果:
Person Salary
0 Jxxx 3xx
1 Pexxx 5xx
2 Suxxx 5xx
3 Cxxx 4xx
答案 1 :(得分:1)
简洁明了的答案是首先从您的mapping_df
创建一个映射,然后在您的target_df
上对该映射应用一个函数。
您可以使用mapping_df
从transpose
获取映射
>>> mapping_df.transpose().to_dict()
{1: {'Attribute': 'Person', 'Change': '3'},
2: {'Attribute': 'Salary', 'Change': '2'}}
然后使用target_dataframe
将其应用于您的map
cleaned = pd.DataFrame()
for mapping in list(mapping_df.transpose().to_dict().values()):
cleaned[mapping['Attribute']] = target_df[mapping['Attribute']].map(
lambda s: s[: - int(mapping['Change']) ]+ int(mapping['Change']) *'x')
您将获得预期的输出
>>> cleaned
Person Salary
1 Jxxx 3xx
2 Pexxx 5xx
3 Suxxx 5xx
4 Cxxx 4xx