根据现有的DataFrame和条件运算符创建新的Pandas DataFrame

时间:2019-04-10 18:27:46

标签: python pandas dataframe

我正在尝试根据现有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:系列的真值不明确

有人知道并且可以给我提示吗?

2 个答案:

答案 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']