Python Pandas - 如何使用DataFrame2中的列的值替换DataFrame1的列

时间:2017-11-26 18:14:48

标签: python python-3.x pandas

大家好我拥有超过50000条记录的Dataframe。它有一个名称列#34;国家"它有重复的值。

作为机器学习项目的一部分,我正在对此列执行标签编码,该列将使用具有整数值的50000条记录替换此列。 (对于那些不了解标签编码的人来说还是好的 - 它采用列的唯一值并为其分配一个整数值,主要基于字母顺序但不确定)。假设此数据帧是DF1,列是"国家"。

现在我的要求是我必须手动对另一个数据帧(DF2)做同样的操作,即不使用标签编码功能

我到目前为止所尝试的内容以及我在哪里受到攻击的内容如下所述

  • 我已经采用了DF1.Country列的唯一值并保存在 新数据帧(temp_df)。
  • 尝试对DF2和temp_df进行正确连接,保持开启="国家"。但得到" NaN"在几个记录中。不确定原因

  • 尝试使用.isin方法进行查找和替换但仍未获取 期望的产出。

所以我的基本问题是如何通过匹配两个数据框中两列的值来使用另一个数据框中的列值填充数据框中的列?

已更新

下面给出了示例代码输出以便更好地理解

DF2中的国家/地区列具有可重复的值,如下所示:

0        us
1        us
2        gb
3        us
4        au
5        fr
6        us
7        us
8        us
9        us
10       us
11       us
12       ca
13       at
14       us
15       us
16       es
17       fi
18       fr
19       us
20       us

temp_df数据框将为每个唯一的国家/地区名称设置整数值,如下所述(注意:此数据框只有唯一值。不重复):

1          gb           49
2          ca           22
3          au            5
4          de           34
5          fr           48
6          br           17
7          jp           75
8          sv          136
9          no          111
10         se          132
11         es           43
12         nl          110
13         mx          103
14         dk           36
15         ro          127
16         ch           24
17         it           71
18         be           10
19         ru          129
20         kr           78
21         fi           44
22         hk           59
23         ie           65
24         sg          133
25         nz          112
26         ar            3
27         at            4
28         in           68
29         cl           26
30         il           66

现在我必须在DF2中创建一个新列,方法是从DF_中的每个国家/地区值中获取temp_df的整数值。希望这会有所帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用pandas.Series.map来完成此任务:

from io import StringIO
import pandas as pd

# Your data ..
data = """
    id,country
    0,AT
    1,DE
    2,UK
    3,FR
    4,AT
    5,UK
    6,IT
    7,DE
"""

df = pd.read_table(StringIO(data), sep=',', index_col=[0])

# Create a map from your current labels to numeric labels:
country_labels = dict([(c, i) for i, c in enumerate(df.country.unique())])

# Use map() to transform your column and re-assign it
df.country = df.country.map(lambda c: country_labels[c])

print(df)

将上述数据转换为

        country
    id         
0             0
1             1
2             2
3             3
4             0
5             2
6             4
7             1

根据您的问题的其中一条评论中的建议,您也可以使用replace()

df = df.replace({'country': country_labels })

答案 1 :(得分:0)

试试这个:

import pandas as pd

# dataframe
df = pd.DataFrame({'Country' : ['z','x', 'x', 'a', 'a', 'b', 'c'], 'Something' : [10, 1, 2, 1, 2, 3, 4]})

# create dictionary for mapping `sorted` countries to integer
country_map = dict(zip(sorted(df.Country.unique()), range(len(df.Country.unique()))))
# country_map should look smthing like:
# {'a': 0, 'b': 1, 'c': 2, 'x': 3, 'z': 4}, where a, b, .. are countries

# replace `Country` coloumn with mapping
df.replace({'Country': country_map })