首页 > 解决方案 > 在两个不同的 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

等等。

出于某种原因,到目前为止我没有尝试过任何工作。

我试过的:

  1. 单行 for 循环

[dataframe1.replace({'State' : {dataframe2.loc[i]['NAME'] : dataframe2.loc[i][ANSI1']}},inplace = True) for i in range(0, len(dataframe2))]

  1. 等效的嵌套循环结构:
    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 编码中的某些内容。

标签: pythonpandasdataframedata-science

解决方案


请使用以下代码删除前导空格或\xa0从您的 dataframe2 中删除。

df2['NAME'] = df2.NAME.str.replace(r'\xa0|^ ','')

然后您可以执行以下操作:

您可以先创建NAME和的字典ANSI1'。然后使用 map() 将值转换StateANSI1值。

第 1 步:创建字典NAMEANSI1使用以下命令。

dState = dict(df2[['NAME','ANSI1']].values)

第 2 步:使用字典映射Statedf1 中的值。使用以下命令。

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

推荐阅读