【问题标题】:Python Pandas: DataFrame as a Lookup TablePython Pandas:作为查找表的 DataFrame
【发布时间】:2016-04-09 20:15:48
【问题描述】:

这是一个预处理的 DataFrame,列表示特定列的频率和成功值。例如:A 列分别与FREQ_ASUCCESS_A 关联。

   A  B  Gold  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  B     0       1       0.00       1       0.00
1  2  A     1       1       0.01       1       0.01

我有另一个 DataFrame,如下所示:

   A  B
0  1  A
1  2  B

现在我想添加相关的频率和成功列(FREQ_*SUCCESS_** : {A,B}),从预处理的 DataFrame 中查找值。一个重要的观察是预处理的 DataFrame 具有一组相同的(非频率/成功)列,但不是一组完整的键。 (见行2A:3B:C不在预处理帧中)

例如:

数据框中的第一行,值为A = 1, B = A,所以:

FREQ_A 将采用FREQ_A 的原始数据帧的值,其中A == 1

FREQ_B 将采用FREQ_B 的原始数据框的值,其中B == A

理想输出

   A  B  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  A       1       0.00       1       0.01
1  2  B       1       0.01       1       0.00

测试用例

   A  B
0  1  A
1  2  B
2  1  C
3  4  A

【问题讨论】:

  • 就不能直接在上面调用drop_duplicates()来实现你想要的吗?
  • 在这个例子中,是的!但是行 1 可能是 1 1 B,它不在原始数据框中 - 我认为将更新第二个数据框以使这不平凡
  • 我不明白您的评论 1 1 B 如何映射到您的列?你能编辑你的问题吗
  • 我会的,如果不清楚,抱歉。 Index = 1, A = 1, B = B,将输出FREQ_A = 3, SUCCESS_A = 0.006667, FREQ_B = 1, SUCCESS_B = 0.010000
  • 现在变得更加混乱了......什么是加入条件?

标签: python pandas dataframe lookup-tables


【解决方案1】:
df1 = pd.DataFrame({
 'A': [1, 2],
 'B': ['B', 'A'],
 'FREQ_A': [1, 1],
 'FREQ_B': [1, 1],
 'Gold': [0, 1],
 'SUCCESS_A': [0.0, 0.01],
 'SUCCESS_B': [0.0, 0.01]})

df2 = pd.DataFrame({'A': [1, 2], 'B': ['A', 'B']})

result = (df2
          .merge(df1[['A', 'FREQ_A', 'SUCCESS_A']], on='A')
          .merge(df1[['B', 'FREQ_B', 'SUCCESS_B']], on='B'))
>>> result
   A  B  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  A       1       0.00       1       0.01
1  2  B       1       0.01       1       0.00

编辑

对于任意数据框:

result = pd.concat(
    [df2, pd.concat([df2[[col]].merge(
                         df1[[col, 'FREQ_' + str(col), 'SUCCESS_' + str(col)]], 
                         on=col, how='left').iloc[:, 1:] 
                     for col in df2], axis=1)], 
    axis=1)

【讨论】:

  • 谢谢!!我可以在一个循环中合并一个列列表而不是on='A'?这会影响合并调用的二次复制问题吗?
  • for col in df.columns: df = df.merge(df_lookup[[col, 'FREQ_'+str(col), 'SUCCESS_'+str(col)]], how='left') 这实际上负责在第二个 DataFrame 中插入 nan 值并维护原始行
  • 内核似乎已经死了。它将自动重新启动。当。我刚刚看到您更新的解决方案,附加到列表然后同时连接应该避免合并的二次复制。我会试试的。
  • 很遗憾,这不适用于问题中的新测试用例
  • 我需要添加how='left'。合并的默认值为'inner'
猜你喜欢
  • 2018-03-14
  • 2021-11-21
  • 2021-07-12
  • 1970-01-01
  • 2018-12-25
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多