【问题标题】:Replace multiple column values in one dataframe by values of another dataframe subjected to a common key column将一个数据帧中的多个列值替换为另一个数据帧的值,该数据帧服从一个公共键列
【发布时间】:2020-08-06 02:36:31
【问题描述】:

我想从另一个 GeoPanda 数据框中更新 GeoPanda 数据框中的值以用于选择列。它们都有一个共同的键,称为“几何”。

例如

df1 = pd.DataFrame([["X",1,1,0],
              ["Y",0,1,0],
              ["Z",0,0,0],
              ["Y",0,0,0]],columns=["geometry","Nonprofit","Business", "Education"])    

df2 = pd.DataFrame([["Y",1,1],
              ["Z",1,1]],columns=["geometry","Non", "Edu"])  

按照这个answer我做了以下步骤:

df1 = df1.set_index('geometry')
df2 = df2.set_index('geometry')

list_1 = ['Nonprofit', 'Education']
list_2 = ['Non', 'Edu']

df1[list_1].update(df2[list_2])

这会导致错误的结果而没有任何警告。我该如何解决这个问题?

注意事项:

一次更新一列 (df1['Nonprofit'].update(df2['Non'])) 将产生正确的结果。

为简单起见,将 GeoPandas 中的几何线串替换为一个字符。

【问题讨论】:

  • 检查你的熊猫版本
  • 我使用的是熊猫版本 '1.0.3'。谢谢
  • 那是因为你没有使用当前版本的熊猫。链接中的答案说使用当前版本的熊猫时会出现警告。
  • 我认为这个问题与列表中传递的多个列标签有关。当我使用 df1['Nonprofit'].update(df2['Non']) 我得到了正确的答案。我在传递 df1[list_1].update(df2[list_2]) 中的列名列表时遇到问题。谢谢

标签: pandas geopandas


【解决方案1】:

DataFrame.update 只更新同名的列!

因此,一种解决方案是首先重命名df2 中的列以匹配df1 中的列。

注意,调用update()时,不需要在df1中指定目标列:所有普通列都会被更新。如果需要,您可以使用列索引从df2 中指定哪些 列。

df2 = df2.rename(columns={'Non': 'Nonprofit', 'Edu': 'Education'})
df1.update(df2)  

# optionally restrict columns:
# df1.update(df2['Nonprofit'])  

# alternative short version, leaving df2 untouched
df1.update(df2.rename(columns={'Non': 'Nonprofit', 'Edu': 'Education'})) 

给了

          Nonprofit  Business  Education
geometry                                
X               1.0         1        0.0
Y               1.0         1        1.0
Z               1.0         0        1.0
Y               1.0         0        1.0

您的“单列”方法有效的原因是您隐式使用Series.update,其中没有通用列这样的概念。

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多