Python 基本数据分析:连接数据类型

Python 基本数据分析:连接数据类型,python,pandas,type-conversion,Python,Pandas,Type Conversion,我在一个数据帧中加载了一个名为natvty的变量,它是50-600之间的数字频率。每个数字代表一个国家,每个国家出现不止一次。我计算了每个国家出现在名单上的次数。现在,我想用国家名称替换国家编号,例如(57=美国)。我尝试了各种各样的for循环,但都没有用。这是到目前为止我的代码。在值计数表中,国家编号位于左侧,其在数据中出现的次数位于右侧。我需要把左边的号码换成国名。与国家名称对应的数字在外部excel表格中分为两列。谢谢 我认为字典是你最好的选择。如果您有国家及其代码的记录,例如: coun

我在一个数据帧中加载了一个名为natvty的变量,它是50-600之间的数字频率。每个数字代表一个国家,每个国家出现不止一次。我计算了每个国家出现在名单上的次数。现在,我想用国家名称替换国家编号,例如(57=美国)。我尝试了各种各样的for循环,但都没有用。这是到目前为止我的代码。在值计数表中,国家编号位于左侧,其在数据中出现的次数位于右侧。我需要把左边的号码换成国名。与国家名称对应的数字在外部excel表格中分为两列。谢谢


我认为字典是你最好的选择。如果您有国家及其代码的记录,例如:

country_dict = {333: 'United States', 123: 'Canada', 456: 'Cuba', ...}
你大概有一个国家及其代码的密钥,因此你可以通过一个循环很容易地生成dict:

country_dict = {}
for i in country_list:
    country = i[0]  # If you had list of countries and their numbers
    number = i[1]
    country_dict[number] = country
在数据帧中添加列后,这应该很简单:

import pandas as pd
df = pd.read_csv('my_data.csv', header=None)
df['country'] = [country_dict[x[0][i]] for i in list(df.index)]

如果country codes(国家代码)列的索引为0,则应该可以使用此功能。我认为可能不需要首先将国家编号替换为国家名称。由于您现在有两个表,一个是列
[“country\u number”,“Navty”]
,另一个(您的excel表,可以导出为
.csv
文件并由
pandas
读取)是列
[“country\u number”,“country\u name”]
,因此您可以简单地将它们合并并保留它们。结果表将有3列:
[“国家/地区编号”、“国家/地区”、“国家/地区名称”]

import pandas as pd

df_nav    = pd.read_csv("my_natvty.csv")
df_cnames = pd.read_csv("excel_country_names.csv") # or use pd.read_excel("country_names.xlsx") directly on excel files

df_nav_with_cnames = df_nav.join(df_cnames, on='country_number')
确保它们都有一列
“国家/地区编号”
。您可以手动修改数据源文件中的表头,或将其视为
索引列
,以类似地应用
联接
。这个概念有点像关系数据库中的SQL操作

文档:

注意:这里的基本思想与相同。我只是想演示如何在两个数据帧中处理不同的列名,以及如何检索所需的每个国家的频率

一个数据框包含国家代码,另一个数据框将国家代码映射到国家名称。您只需在国家/地区代码列中加入它们。您可以阅读更多关于和的信息

上面的输出是

加拿大1 美国2 墨西哥3 名称:国家/地区名称,数据类型:int64
对于这类事情,我总是更喜欢
map
函数,它会吃掉一本字典,或者是一个函数

import pandas as pd
import numpy.random as np
In [12]:

print 
# generate data
df = pd.DataFrame(data={'natvty':np.randint(low=20,high=500,size=10),
                        'country':pd.Series([1,2,3,3,3,2,1,1,2,3])})
df
   country  natvty
0        1      24
1        2     310
2        3      88
3        3     459
4        3      38
5        2      63
6        1     194
7        1     384
8        2     281
9        3     360
然后,
dict
。在这里,我只是键入它,但您可以从csv或excel文件加载它。然后,您需要将键设置为索引,并将生成的序列转换为dict(
to_dict()

然后您可以简单地映射值标签

df.country.map(countrymap)
Out[10]:
0        US
1    Canada
2    Mexico
3    Mexico
4    Mexico
5    Canada
6        US
7        US
8    Canada
9    Mexico
Name: country, dtype: objec

还有,所以不需要将Excel导出到CSV。@IgorRaush是的,这当然是一个不错的选择。但我希望数据分析人员能够在无需考虑可访问性的情况下使用更透明和标准化的格式:)这行不通
df[1]
将返回一个包含所有国家代码的
Series
对象,该对象不能用作普通Python字典的键。谢谢,我刚刚意识到我的问题有点含糊不清,因为我没有提供原始数据的格式,但这个答案正是我想要的。
countrymap = {1:'US',2:'Canada',3:'Mexico'}
df.country.map(countrymap)
Out[10]:
0        US
1    Canada
2    Mexico
3    Mexico
4    Mexico
5    Canada
6        US
7        US
8    Canada
9    Mexico
Name: country, dtype: objec