我使用两个不同的 pandas 数据框:
数据框1:
Year State EMW
0 1968 Alabama 8.55
1 1968 Alaska 15.61
2 1968 Arizona 8.55
3 1968 Arkansas 8.55
4 1968 California 12.26
... ... ... ...
2857 2020 Virginia 7.25
2858 2020 Washington 13.50
2859 2020 West Virginia 8.75
2860 2020 Wisconsin 7.25
2861 2020 Wyoming 7.25
和 dataframe2:
NAME STATUS ISO ANSI1 ANSI2 USPS
0 Alabama State US-AL AL 1 AL
1 Alaska State US-AK AK 2 AK
2 Arizona State US-AZ AZ 4 AZ
3 Arkansas State US-AR AR 5 AR
4 California State US-CA CA 6 CA
5 Colorado State US-CO CO 8 CO
6 Connecticut State US-CT CT 9 CT
7 Delaware State US-DE DE 10 DE
8 District of Columbia Federal district US-DC DC 11 q
9 Florida State US-FL FL 12 FL
... ... ... ... ... ... ...
我正在尝试做什么:
将 dataframe1 中“State”列中的所有值替换为 dataframe2 中的等效 ANSI1 代码。
基本上,我希望得到这样的结果:
Alabama -> AL
Alaska -> AK
Arizona -> AZ
等等。
出于某种原因,到目前为止我尝试过的方法都不起作用。
我尝试过的:
- 单行 for 循环
[dataframe1.replace({'State' : {dataframe2.loc[i]['NAME'] : dataframe2.loc[i][ANSI1']}},inplace = True) 对于范围内的 i (0, len(dataframe2))]
- 等效的嵌套循环结构:
for state_name in pd.unique(dataframe1['State']):
for ansi_name in dataframe2['ANSI1']:
if ansi_name == state_name :
dataframe1.replace({'State' : { state_name : ansi_name }}, inplace = True)
注意 我怀疑我可能正在尝试比较不同的类型,所以我尝试了:
dataframe1.replace({'State' : {'Alabama' : 'AL'}}, inplace=True)
果然,它成功了。
编辑:
创建字典
dState = dict(df1[['NAME', 'ANSI1']].values)
生成一个字典,其中的值如下:
{'\xa0Alabama': 'AL', '\xa0Alaska': 'AK', '\xa0Arizona': 'AZ', '\xa0Arkansas': 'AR', '\xa0California': 'CA', '\x
a0Colorado': 'CO', '\xa0Connecticut': 'CT', '\xa0Delaware': 'DE', ' District of Columbia': 'DC', ' Florida': 'FL
', '\xa0Georgia': 'GA', '\xa0Hawaii': 'HI', '\xa0Idaho': 'ID', '\xa0Illinois': 'IL', '\xa0Indiana': 'IN', '\xa0I
owa': 'IA', '\xa0Kansas': 'KS', '\xa0Kentucky': 'KY', '\xa0Louisiana': 'LA', '\xa0Maine': 'ME', '\xa0Maryland':
'MD', '\xa0Massachusetts': 'MA', '\xa0Michigan': 'MI', '\xa0Minnesota': 'MN', '\xa0Mississippi': 'MS', '\xa0Miss
ouri': 'MO', '\xa0Montana': 'MT', '\xa0Nebraska': 'NE', '\xa0Nevada': 'NV', '\xa0New Hampshire': 'NH', '\xa0New
Jersey': 'NJ', '\xa0New Mexico': 'NM', '\xa0New York': 'NY', '\xa0North Carolina': 'NC', '\xa0North Dakota': 'ND
', '\xa0Ohio': 'OH', '\xa0Oklahoma': 'OK', '\xa0Oregon': 'OR', '\xa0Pennsylvania': 'PA', '\xa0Rhode Island': 'RI
', '\xa0South Carolina': 'SC', '\xa0South Dakota': 'SD', '\xa0Tennessee': 'TN', '\xa0Texas': 'TX', '\xa0Utah': '
UT', '\xa0Vermont': 'VT', '\xa0Virginia': 'VA', '\xa0Washington': 'WA', '\xa0West Virginia': 'WV', '\xa0Wisconsi
n': 'WI', '\xa0Wyoming': 'WY', ' Puerto Rico': 'PR', ' U.S. Virgin Islands': 'VI', ' Guam': 'GU', ' Northern Mar
iana Islands': 'MP', ' American Samoa': 'AS'}
所以现在我无法通过将它们与 df1['State'] 中的值进行比较来得到任何结果
我现在开始怀疑我可能在导入 df2 的 csv 编码中遗漏了某些内容。
最佳答案
这个问题可以通过使用数据帧操作通过几个简单的步骤来完成
- 从 df2 中提取您将使用的数据
- 合并数据框
- 删除不必要的值
代码中的代码看起来像这样。
第 1 步:
df2_use = df2[['Name','ANSI1']]
第 2 步:
df1.merge(df2_use , how='left', right_on='Name', left_on='State')
第 3 步:
df1 = df1.drop(['Name','State'], axis=1).rename(columns={'ANSI1': 'State')
您将获得您正在寻找的数据框
关于python - 在两个不同的 pandas 数据帧之间搜索和替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66017014/