如何根据给定条件在熊猫中更改特定行中的值?

时间:2018-12-12 15:21:58

标签: python pandas numpy

我想做这样的事情:

for row in df:
if row['Country'] == 'unknown':
    row['Country'] = city2country_mapping[row['city']]

国家和城市是列。

“ city2country_mapping”是字典,其中“键:值”对是“ city”:“ country”。

(基本上,我试图通过从字典中获取国家/地区来填充未知数,因为我知道每一行的城市)

3 个答案:

答案 0 :(得分:1)

您可以使用pandas.Series.where将其向量化:

df['country'] = df.country.where(
    df.country != 'unknown', df.city.map(city2country_mapping))

df.city.map(city2country_mapping)将首先创建一个包含每个城市相应国家/地区的系列,然后使用它替换unknown列中的country个国家/地区。

答案 1 :(得分:1)

您可以使用apply进行此操作:

df['Country'] = df.apply(lambda row: city2country_mapping[row['city']] 
                                     if row['Country'] == 'unknown' else row['Country'], axis=1)

对于“未知”国家/地区,Lambda从映射中返回城市,否则仅返回该行中的国家/地区。

答案 2 :(得分:1)

编辑特定行:DataFrame.locSeries.where

用于编辑DataFrame对象的特定行(“切片”)的标准选项是.loc

被接受的答案使用整洁的pandas.Series.where应用程序来重写df.Country系列,对于此特定任务而言,它更为简洁。

重新编码值:.apply.map

您可以使用.map()直接用字典重新编码系列-无需.apply() lambda函数。

示例

# Example data
df = pd.DataFrame({'Country': ['unknown', 'USA', 'unknown', 'UK', 'USA', 'unknown'],
                   'City': ['London', 'New York', 'New York', 'London', 'New York', 'Paris']
                  })
city2country_mapping = {'London': 'UK', 'New York': 'USA', 'Paris': 'France'}

# print(df)

#    Country      City
# 0  unknown    London
# 1      USA  New York
# 2  unknown  New York
# 3       UK    London
# 4      USA  New York
# 5  unknown     Paris

df.loc[df.Country == 'unknown', 'Country'] = df[df.Country == 'unknown'].City.map(city2country_mapping)
print(df)

输出:

  Country      City
0      UK    London
1     USA  New York
2     USA  New York
3      UK    London
4     USA  New York
5  France     Paris