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

发布于 2016-02-25 08:20:42
我认为一开始可能没有需要用国家名称来代替国家数字。由于您现在有两个表,一个包含列["country_number", "natvty"],另一个(您的excel表,可以导出为.csv文件并由pandas读取)包含列["country_number", "country_name"],因此您只需将这两个表连接起来并保留它们。结果表将有3列:分别为["country_number", "natvty", "country_name"]。
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')确保它们都有一个列"country_number"。您可以手动修改数据源文件中的表头,也可以将其视为index columns来类似地应用join。这个概念有点像关系数据库中的SQL操作。
文档:http://pandas.pydata.org/pandas-docs/stable/merging.html
发布于 2016-02-25 09:27:43
对于这类事情,我总是更喜欢使用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文件中加载它。然后,您需要将键设置为索引,并将结果序列转换为字典(to_dict())。
countrymap = {1:'US',2:'Canada',3:'Mexico'}然后,您可以简单地map值标签。
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发布于 2016-02-25 08:47:31
注意:这里的基本思想与相同。我只是想演示如何在两个数据框中处理不同的列名,以及如何检索您想要的每个国家的频率。
您有一个包含国家代码的数据框,以及另一个将国家代码映射到国家名称的数据框。您只需在国家/地区代码列中加入它们。您可以阅读有关merging in Pandas和SQL joins的更多信息。
import pandas as pd
# this is your nativity frame
nt = pd.DataFrame([
[123],
[123],
[456],
[789],
[456],
[456]
], columns=('natvty',))
# this is your country code map
# in reality, use pd.read_excel
cc = pd.DataFrame([
[123, 'USA'],
[456, 'Mexico'],
[789, 'Canada']
], columns=('country_code', 'country_name'))
# perform a join
# now each row has an associated country_name
df = nt.merge(cc, left_on='natvty', right_on='country_code')
# now you can get frequencies on country names instead of country codes
print df.country_name.value_counts(sort=False)上面的输出是
Canada 1
USA 2
Mexico 3
Name: country_name, dtype: int64https://stackoverflow.com/questions/35615515
复制相似问题