【问题标题】:Insert list into cells which meet column conditions将列表插入满足列条件的单元格中
【发布时间】:2017-02-04 16:20:34
【问题描述】:

考虑df

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

我想添加另一列 "D" 以便 D 根据 "A""B""C" 的条件包含不同的列表

   A  B  C  D
0  3  2  1  [1,0]
1  4  2  3  [1,0]
2  1  4  1  [0,2]
3  2  2  3  [2,0]

我的代码 sn-p 看起来像:

df['D'] = 0
df['D'] = df['D'].astype(object)

df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = [1,0]
df.loc[(df['A'] == 1) , "D"] = [0,2]
df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = [2,0]

当我尝试运行此代码时,它会引发以下错误:

ValueError: Must have equal len keys and value when setting with an iterable

我已按照here 的建议将该列转换为Object 类型,但仍然出现错误。

我可以推断的是,pandas 正在尝试迭代列表的元素并将这些值中的每一个分配给单元格,而我试图将整个列表分配给符合条件的所有单元格。

有什么方法可以按上述方式分配列表吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    另一种解决方案是创建由list 填充的Seriesshape,用于生成lengthdf

    df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = pd.Series([[1,0]]*df.shape[0])
    df.loc[(df['A'] == 1) , "D"] = pd.Series([[0,2]]*df.shape[0])
    df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = pd.Series([[2,0]]*df.shape[0])
    print (df)
       A  B  C       D
    0  3  2  1  [1, 0]
    1  4  2  3  [1, 0]
    2  1  4  1  [0, 2]
    3  2  2  3  [2, 0]
    

    【讨论】:

    • 如果索引是任意的,你可以使用pd.Series([[1,0]], index=df.index)
    【解决方案2】:

    这是一个愚蠢的方法

    cond1 = df.A.gt(1) & df.B.gt(1)
    cond2 = df.A.eq(1)
    cond3 = df.A.eq(2) & df.C.ne(0)
    
    df['D'] = cond3.map({True: [2, 0]}) \
      .combine_first(cond2.map({True: [0, 2]})) \
      .combine_first(cond1.map({True: [1, 0]})) \
    
    df
    

    【讨论】:

      【解决方案3】:

      免责声明:这是我自己的问题。

      jezraelpiRSquared 提供的答案都有效。

      我只是想添加另一种方法,尽管与我在问题中发布的要求略有不同。您可以将list 转换为string,然后通过类型转换访问它,而不是尝试插入list

      df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = '[1,0]'
      df.loc[(df['A'] == 1) , "D"] = '[0,2]'
      df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = '[2,0]'
      

      这可能并不适用于每个人的使用,但我绝对可以想到这样就足够的情况。

      【讨论】:

        猜你喜欢
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多