Python循环两个不同的dataFrame以创建新列

时间:2018-05-22 15:51:26

标签: python pandas loops dataframe

我想通过引用另一个数据帧向数据框添加新列。

我想使用startswith方法运行if语句,将df1 [' BSI']列与df2 [' initial']匹配,以分配相应的df2 ['标记& #39;],并为df1提供一个由标记组成的新列,我将用于标记标记样式。

我在df1循环中循环df2时遇到问题。我基本上无法弄清楚如何将df1项目调用到df2循环以与df2项目进行比较。

df1看起来像这样:

    BSI     Shelter_Number  Location                            Latitude    Longitude
0   AA-010  1085            SUSSEX (N SIDE) & RIDEAU FALLS      45.439571   -75.695694
1   AA-030  3690            SUSSEX (E SIDE) & ALEXANDER NS      45.442795   -75.692322
2   AA-180  279             CRICHTON (E SIDE) & BEECHWOOD FS    45.439556   -75.676849
3   AA-200  2018            BEECHWOOD (S SIDE) & CHARLEVOIX NS  45.441154   -75.673622
4   AA-220  3301            BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188   -75.671356

df2看起来像这样:

    initial marker
0   AA      bo
1   AB      bv
2   AC      b^
3   AD      b<
4   AE      b>

期望的输出是:

BSI, Shelter_Number, Location, Latitude, Longitude, marker

0
AA-010 1085 SUSSEX (N SIDE) & RIDEAU FALLS 45.439571 -75.695694 bo

1
AA-030 3690 SUSSEX (E SIDE) & ALEXANDER NS 45.442795 -75.692322 bo

2
AA-180 279 CRICHTON (E SIDE) & BEECHWOOD FS 45.439556 -75.676849 bo

3
AA-200 2018 BEECHWOOD (S SIDE) & CHARLEVOIX NS 45.441154 -75.673622 bo

4
AA-220 3301 BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188 -75.671356 bo

2 个答案:

答案 0 :(得分:1)

使用地图。事实上,使用map有许多相似的答案,但唯一的区别是你在df1中只使用了BSI的一部分进行匹配

df1['marker'] = df1['BSI'].str.extract('(.*)-', expand = False).map(df2.set_index('initial').marker)



    BSI     Shelter_Number  Location                            Latitude    Longitude   marker
0   AA-010  1085            SUSSEX (N SIDE) & RIDEAU FALLS      45.439571   -75.695694  bo
1   AA-030  3690            SUSSEX (E SIDE) & ALEXANDER NS      45.442795   -75.692322  bo
2   AA-180  279             RICHTON (E SIDE) & BEECHWOOD FS     45.439556   -75.676849  bo
3   AA-200  2018            BEECHWOOD (S SIDE) & CHARLEVOIX NS  45.441154   -75.673622  bo
4   AA-220  3301            BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188   -75.671356  bo

答案 1 :(得分:0)

您可以从df2创建字典,然后映射df1以创建新列。如果BSI中的所有条目与提供的格式相同,则只需选择前2个字母即可。如果它需要更复杂,就像第一个连字符之前的所有内容一样,那么你可以使用正则表达式。

这里有一些测试数据

import pandas as pd
df1 = pd.DataFrame({'BSI': ['AA-010', 'AA-030', 'AA-180', 'AA-200', 'AA-220'],
                    'Latitude': [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({'initial': ['AA', 'AB', 'AC', 'AD', 'AE'],
                    'marker': ['bo', 'bv', 'b^', 'b<', 'b>']})

这是映射

dct = pd.Series(df2.marker.values, index=df2.initial).to_dict()
df1['marker'] = df1['BSI'].str[0:2].map(dct)

      BSI  Latitude marker
0  AA-010         1     bo
1  AA-030         2     bo
2  AA-180         3     bo
3  AA-200         4     bo
4  AA-220         5     bo