【问题标题】:Overwrite field values based on membership in a set根据集合中的成员资格覆盖字段值
【发布时间】:2015-01-20 17:05:34
【问题描述】:

在 Pandas Dataframe 中,如果 df['field1'] 是字段 df2['field2'] 的成员,那么我需要用指定的值覆盖第三个字段 df[field3] 的值。

我尝试在 sqlite3 中使用 CASE:

conn=sqlite3.connect(':memory:')
sql.write_frame(equip,name='equip',con=conn)
sql.write_frame(list1,name='list1',con=conn)
list2=sql.read_frame("SELECT CASE WHEN (a.'Invoice Number' IN (SELECT     b.'Sold On Invoice Number' FROM equip b) THEN a.'Type'='blah' FROM list1 as a END",conn)

以下是带有示例的数据示例:

列表1 出[345]: 发票编号 发票类型 0 1341262 无 1 1037970 无 2 1037941 无 3 1805305 无 4 3302259 无 5 1037388 无

列表2 出[347]: 以发票号出售 0 1341250 1 3302261 2 1341271 3 1037388 4 134127

由于 1037388 在两个列表中,list1['Invoice Type'] 需要等于 'Equipment.'

【问题讨论】:

  • 请发布一些您的数据样本,“是会员”是什么意思? df2['field2'] 是 Python 集吗?
  • 我从我的两个数据框中发布了样本。希望它有所帮助。我不知道如何更清楚地发布它们。

标签: python if-statement pandas sqlite case-when


【解决方案1】:

好的,我假设您的帧实际上看起来像这样(另外,here's 如何制作数据帧):

a = pd.DataFrame({'Invoice Number':[1341262, 10327970, 1037941, 1805305, 3302259, 1037388], 'Invoice Type':[None]*6})
b = pd.DataFrame({'Sold On Invoice Number':[1341250, 3302261, 1341271, 1037388, 134127]})

要获取重叠的索引,请使用 .isin 执行 boolean slice,如下所示:

idxs = a[a['Invoice Number'].isin(b['Sold On Invoice Number'])].index

然后将“设备”分配给重叠:

 a.loc[idxs, 'Invoice Type'] = 'Equipment'

【讨论】:

  • 谢谢!比我将重叠解析为单独的 df、更改所需字段并将两个表重新附加在一起的解决方案要好得多。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多