python - 在两个不同的 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
和数据框2:
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) for i in range(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 编码中的某些内容。
解决方案
请使用以下代码删除前导空格或\xa0
从您的 dataframe2 中删除。
df2['NAME'] = df2.NAME.str.replace(r'\xa0|^ ','')
然后您可以执行以下操作:
您可以先创建NAME
和的字典ANSI1'
。然后使用 map() 将值转换State
为ANSI1
值。
第 1 步:创建字典NAME
并ANSI1
使用以下命令。
dState = dict(df2[['NAME','ANSI1']].values)
第 2 步:使用字典映射State
df1 中的值。使用以下命令。
df1['ANSI1'] = df1.State.map(dState)
这将为您提供您正在寻找的结果。
代码是:
dState = dict(df2[['NAME','ANSI1']].values)
df1['ANSI1'] = df1.State.map(dState)
结果将是:
数据框 1:
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
数据框 2:
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
5 2020 Virginia 7.25
6 2020 Washington 13.50
7 2020 West Virginia 8.75
8 2020 Wisconsin 7.25
9 2020 Wyoming 7.25
为 dState 创建的中间字典是:
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', 'Colorado': 'CO', 'Connecticut': 'CT', 'Delaware': 'DE', 'District of Columbia': 'DC', 'Florida': 'FL'}
注意:这本词典没有所有的状态。
使用 map 的结果将为您提供:
Year State EMW ANSI1
0 1968 Alabama 8.55 AL
1 1968 Alaska 15.61 AK
2 1968 Arizona 8.55 AZ
3 1968 Arkansas 8.55 AR
4 1968 California 12.26 CA
5 2020 Virginia 7.25 NaN
6 2020 Washington 13.50 NaN
7 2020 West Virginia 8.75 NaN
8 2020 Wisconsin 7.25 NaN
9 2020 Wyoming 7.25 NaN
一旦你在字典中拥有了所有的状态,你的 NaN 值就会消失。
我又添加了几个州。这是更新的结果:
Year State EMW ANSI1
0 1968 Alabama 8.55 AL
1 1968 Alaska 15.61 AK
2 1968 Arizona 8.55 AZ
3 1968 Arkansas 8.55 AR
4 1968 California 12.26 CA
5 2020 Virginia 7.25 VA
6 2020 Washington 13.50 WA
7 2020 West Virginia 8.75 WV
8 2020 Wisconsin 7.25 WI
9 2020 Wyoming 7.25 WY
推荐阅读
- apache-spark - Databricks REST API 节流和容量限制/限制
- javascript - 在一个组件中反应清除 LocalStorage 和 Asyncstorage
- elasticsearch - Elasticsearch 索引中嵌套字段的 Cube.js 架构
- python - 在python中增量加载大数据
- java - 将 sasl.jaas.config 添加到 payara 上的 Kafka MDB
- python - 看门狗和使用 Telethon 发送消息
- composer-php - 当使用 0 作为带有插入符号的补丁版本时,composer 会安装开发版本的软件包
- reactjs - Wen 对模态使用 react-navigation,isFocused 变得无用
- java - 存储库未更新列表属性
- java - 根据两个值对地图列表进行排序