将列表插入满足列条件的单元格中
Posted
技术标签:
【中文标题】将列表插入满足列条件的单元格中【英文标题】: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 正在尝试迭代列表的元素并将这些值中的每一个分配给单元格,而我试图将整个列表分配给符合条件的所有单元格。
有什么方法可以按上述方式分配列表吗?
【问题讨论】:
【参考方案1】:另一种解决方案是创建由list
填充的Series
和shape
,用于生成length
的df
:
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】:免责声明:这是我自己的问题。
jezrael 和 piRSquared 提供的答案都有效。
我只是想添加另一种方法,尽管与我在问题中发布的要求略有不同。您可以将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]'
这可能并不适用于每个人的使用,但我绝对可以想到这样就足够的情况。
【讨论】:
以上是关于将列表插入满足列条件的单元格中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OpenOffice 中将一列单元格从一张表插入到另一张表的单个单元格中?