【问题标题】:perform operation on selected columns of dataframe based on threshold present in another dataframe根据另一个数据帧中存在的阈值对数据帧的选定列执行操作
【发布时间】:2021-06-08 09:37:46
【问题描述】:

我有一个数据框

df1 = pd.DataFrame([["A",1,98,56,61,1,4,6], ["B",1,79,54,36,2,5,7], ["C",1,97,32,83,3,6,8],["B",1,96,31,90,4,7,9], ["C",1,45,32,12,5,8,10], ["A",1,67,33,55,6,9,11]], columns=["id","date","c1","c2","c3","x","y","z"])

我有另一个数据框,其中存在选定列的条件

df2 = pd.DataFrame([["c2",40], ["c1",80], ["C3",90]], columns=["col","condition"])

根据 df2 中存在的条件对 df1 执行操作。就像 df2 中 c1 的值是 80 一样,如果值小于 80,则将 df1 的 c1 列中的值更改为 -1,如果高于 80,则将值更改为 1。对存在的其他列执行类似的操作也在df2中。

预期输出:

df_out = pd.DataFrame([["A",1,1,1,-1,1,4,6], ["B",1,-1,1,-1,2,5,7], ["C",1,1,-1,-1,3,6,8],["B",1,1,-1,1,4,7,9], ["C",1,-1,-1,-1,5,8,10], ["A",1,-1,-1,-1,6,9,11]], columns=["id","date","c1","c2","c3","x","y","z"])

怎么做?

【问题讨论】:

    标签: python python-3.x pandas python-2.7 dataframe


    【解决方案1】:

    首先将df2 转换为Series,然后创建掩码以与列名进行比较,通过DataFrame.ge 比较大于或等于Series 并传递给numpy.where

    s = df2.set_index('col')['condition']
    
    m = df1.columns.isin(s.index)
    df1.loc[:, m] = np.where(df1.loc[:, m].ge(s), 1, -1)
    print (df1)
      id  date  c1  c2  c3  x  y   z
    0  A     1   1   1  -1  1  4   6
    1  B     1  -1   1  -1  2  5   7
    2  C     1   1  -1  -1  3  6   8
    3  B     1   1  -1   1  4  7   9
    4  C     1  -1  -1  -1  5  8  10
    5  A     1  -1  -1  -1  6  9  11
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多