根据其他数据框的列填充数据框列

时间:2020-08-03 15:32:35

标签: python pandas dataframe

我有一个包含区域人口的数据框,并且我想填充具有相同分布的其他数据框的列。

第一个数据帧如下:

Municipio   Population  Population5000
0   Lisboa  3184984 1291
1   Porto   2597191 1053
2   Braga   924351  375
3   Setúbal 880765  357
4   Aveiro  814456  330
5   Faro    569714  231
6   Leiria  560484  227
7   Coimbra 541166  219
8   Santarém    454947  184
9   Viseu   378784  154
10  Viana do Castelo    252952  103
11  Vila Real   214490  87
12  Castelo Branco  196989  80
13  Évora   174490  71
14  Guarda  167359  68
15  Beja    158702  64
16  Bragança    140385  57
17  Portalegre  120585  49
18  Total   12332794    5000

基本上,第二个数据帧有5000行,我想创建一个列,其名称与第一个df的Municipios相对应。

我的问题是我不知道如何从第一个数据框中填充具有相同发生率分布的列。

最终结果将是这样的:

Municipio
0 Porto
1 Porto
2 Lisboa
3 Évora
4 Lisboa
5 Aveiro
...
4996 Viseu
4997 Lisboa
4998 Porto
4999 Guarda
5000 Beja

有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

我将使用一个简单的理解方法来构建一个大小为5000的列表,其中城镇名称的元素数量应与Population5000的值一样多,如果需要随机顺序,可以将其洗牌:

lst = [m for m,n in df.loc[:len(df)-2,
                           ['Municipio', 'Population5000']].to_numpy()
       for i in range(n)]
random.shuffle(lst)
result = pd.Series(1, index=lst, name='Municipio')

random.seed(0)初始化,它给出:

Setúbal     1
Santarém    1
Lisboa      1
Setúbal     1
Aveiro      1
           ..
Santarém    1
Porto       1
Lisboa      1
Faro        1
Aveiro      1
Name: Municipio, Length: 5000, dtype: int64

答案 1 :(得分:0)

您可以只做一张简单的地图;

map = dict(zip(DF1['Population5000'], DF1['Municipio']))
DF2['Municipo'] = DF2['Population5000'].map(map)

或仅将地图(DF2)中的人口5000列名称更改为包含您的人口值的列。

答案 2 :(得分:0)

map = dict(zip(municipios['Population5000'], municipios['Municipio']))
df['Municipio'] = municipios['Population5000'].map(map)

我按照Amen_90的建议尝试了此操作,并且从第二个数据框中的Municipio列开始,当我希望在第一个数据帧中具有与“ Population5000”列中相同的value_counts时,每个Municipio实例仅填充一个实例。 / p>

df["Municipio"].value_counts()

Beja                1
Aveiro              1
Bragança            1
Vila Real           1
Porto               1
Santarém            1
Coimbra             1
Guarda              1
Leiria              1
Castelo Branco      1
Viseu               1
Total               1
Faro                1
Portalegre          1
Braga               1
Évora               1
Setúbal             1
Viana do Castelo    1
Lisboa              1
Name: Municipio, dtype: int64