如果列值为“ foo”,则在同一行上将数据框追加新值吗?

时间:2018-07-04 12:24:57

标签: python pandas dataframe merge

我有一个包含国家/地区名称的数据框,我想在此框后面附加每个国家/地区的首都的坐标。

我创建了一个具有所有这样格式的坐标的字典:

{'Czech Republic': (14.4212535, 50.0874654), 'Zimbabwe': (31.045686, -17.831773), 
'Hungary': (19.0404707, 47.4983815), 'Nigeria': (7.4892974, 9.0643305)}

我有一个数据框,其中一列为“ COUNTRY”,并希望有两个新列“ LAT”,“ LON”用于存储坐标。我尝试将dict直接转换为数据框,但没有按我希望的那样工作。

是否可以创建带有两列“ LAT”,“ LON”的空df,将其与原始df合并,然后进行迭代,检查国家/地区并逐个添加坐标,或者有更好的方法吗?这样做吗?

一个国家可以在df中出现很多次,条目大约有3万,因此恐怕会造成一些开销。我是Pandas的新手,所以我可能会缺少一个可以很好地使用此功能的内置功能。

您是否对解决此问题的最佳方法有任何想法?

预先感谢

2 个答案:

答案 0 :(得分:3)

通过索引[0][1]map的索引来选择元组的第一个和第二个值来使用2 dict理解:

d = {'Czech Republic': (14.4212535, 50.0874654), 'Zimbabwe': (31.045686, -17.831773), 
'Hungary': (19.0404707, 47.4983815), 'Nigeria': (7.4892974, 9.0643305)}

df = pd.DataFrame({'COUNTRY':['Zimbabwe','Hungary', 'Slovakia']})

df['LAT'] = df['COUNTRY'].map({k:v[0] for k, v in d.items()})
df['LON'] = df['COUNTRY'].map({k:v[1] for k, v in d.items()})
print (df)
    COUNTRY        LAT        LON
0  Zimbabwe  31.045686 -17.831773
1   Hungary  19.040471  47.498382
2  Slovakia        NaN        NaN

答案 1 :(得分:1)

除了上述解决方案之外,您还可以使用iloc

d = {'Czech Republic': (14.4212535, 50.0874654), 'Zimbabwe': (31.045686, -17.831773), 'Hungary': (19.0404707, 47.4983815), 'Nigeria': (7.4892974, 9.0643305)}

d = pd.DataFrame(d) 
print(d)

    Czech Republic  Zimbabwe    Hungary Nigeria
0   14.421254   31.045686   19.040471   7.489297
1   50.087465   -17.831773  47.498382   9.064331

df = pd.DataFrame({'COUNTRY':['Zimbabwe','Hungary', 'Slovakia']})

df['LAT'] = df['COUNTRY'].map(d.iloc[0]) 
df['LON'] = df['COUNTRY'].map(d.iloc[1])

print(df)

  COUNTRY     LAT         LON
0 Zimbabwe    31.045686   -17.831773 
1 Hungary     19.040471   47.498382 
2 Slovakia    NaN         NaN