我正在尝试根据现有DataFrame中的值创建一个新的DataFrame
源数据框架
a = pd.DataFrame({'x': ['1', '2', '3', '4', '5'], 'y': ['1', '---', '1', '1', '1']})
x y
0 1 1
1 2 ---
2 3 1
3 4 1
4 5 1
目标目标DataFrame
b = pd.DataFrame({'z': int(a['x']) + int(a['y']) if a['y'] != '---' else '---'})
z
0 2
1 ---
2 4
3 5
4 6
我得到一个“ ValueError:系列的真值不明确 ”
有人知道并且可以给我提示吗?
答案 0 :(得分:1)
如果您的数据框完全由数字组成,则像a.astype(int).sum(axis = 1)
这样的内联代码将解决您的问题。
但是,由于不能保证每一行都有数字,因此必须对各行进行迭代并根据情况进行所需的计算。在下面的示例中,我将 apply 函数与lambda一起使用以达到预期的效果。
pd.DataFrame(
dict(
z = a.apply(lambda r: int(r['x']) + int(r['y']) if r['y'] != '---' else '---' , axis=1 )
)
)
要在以下相同的DF中申请:
a['z'] = a.apply(lambda r: int(r['x']) + int(r['y']) if r['y'] != '---' else '---' , axis=1 )
答案 1 :(得分:0)
以下解决方案在y!='---'
处获取索引,然后对该索引处a['x']
和a['y']
处的值求和。在求和之前将dtype转换为int
很重要。
a = pd.DataFrame({'x': ['1', '2', '3', '4', '5'], 'y': ['1', '---', '1', '1', '1']})
a['z'] = None
indexer = a['y'].loc[lambda x:x!='---'].index
a['z'] = a[a.index.isin(indexer)]['x'].astype(int) + a[a.index.isin(indexer)]['y'].astype(int)
a.loc[a['z'].isna(), 'z'] = '---'
b = a[['z']]
print(b)
#Output
z
0 2
1 ---
2 4
3 5
4 6
这假设'---'
是数据集中的唯一符号,并且在不满足条件的任何地方,z
的值为NaN
。然后将这些NaN
的值在---
中设置为a['z']
。