【问题标题】:Pandas -- set row values based on values in another tablePandas - 根据另一个表中的值设置行值
【发布时间】:2018-08-01 10:39:43
【问题描述】:

我在熊猫中有两张桌子。一个是大约 10,000 多行,如下所示:

表 1

col_1      date      state  ratio [50 more cols]
   A       10/12      NY     .5
   A       12/05      MA     NaN
   .........

我有另一个大约 10 行的表,如下所示:

表 2

date     state    ratio
12/05    MA       .9
12/03    MA       .8
............

我需要根据表 2 中的日期和状态值设置表 1 中的比率。理想的解决方案是合并日期和状态,但这会创建两列:ratio_x 和 ratio_y

我需要一种方法将表 1 中的比率设置为表 2 中日期和状态都匹配的相应比率。表 1 中的比率可以被覆盖。

如果这可以通过合并正确完成,那么它也可以。

编辑:您可以将表 2 视为映射到特定状态值(因此在此示例中表 2 中的所有状态都是 MA)

【问题讨论】:

  • “创建两列” - 那又怎样?删除其中一列并重命名另一列。
  • 这可能不是最优雅或短手的方式,但您可以创建一个连接日期和状态的列,然后使用该日期将表 1 中的比率列设置为表 2 中的比率-state 列作为您的索引。就像 DYZ 说的,如果不需要,可以随时删除附加列。
  • 我需要两列中的值。我已经编辑了问题以反映这一点。基本上,如果状态和日期匹配,则覆盖比率,无论它是值还是 NaN。否则我需要保留已经存在的价值。

标签: python pandas dataframe


【解决方案1】:

您需要选择首先采用哪个ratio 值。假设您希望表 2 中的比率优先:

# join in ratio from the other table
table1 = table1.join(table2.set_index(["date", "state"])["ratio"].to_frame("ratio2"), on=["date", "state"])

# take ratio2 first, then the existing ratio value if ratio2 is null
table1["ratio"] = table1["ratio2"].fillna(table1["ratio"])

# delete the ratio2 column
del table1["ratio2"]

【讨论】:

  • 我收到一个错误,我正在合并对象和 datetime64[ns] 列。正常合并不会发生这种情况,我假设这是因为日期设置为索引
  • "您正在尝试合并 object 和 datetime64[ns] 列。如果您希望继续,您应该使用 pd.concat" 在此之前的步骤中,我确保两个表中的日期都是相同的类型,而且我之前已经能够使用 date 进行合并,所以我认为这不是一个实际的数据类型问题,而是当它设置为索引时会出现的问题
  • 你确定吗?当你运行table1["date"].dtype == table2["date"].dtype 时会发生什么?
【解决方案2】:

首先从df2创建一个映射系列:

s = df2.set_index(['date', 'state'])['ratio']

然后喂给df1

df1['ratio'] = df1.set_index(['date', 'state']).index.map(s.get)\
                  .fillna(df1['ratio'])

df2 中的比率优先。

【讨论】:

  • .get 不需要值吗?正如我得到“TypeError:'value'必须是一个标量,通过:系列”
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 2022-01-08
  • 2022-09-29
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多