这是一个起始DataFrame:
ipdb> df[["line_amount","modifiedAmount"]]
line_amount modifiedAmount
0 30.00
1 2.88 2.88
2 199.20 199.2
3 -105.00 -104
4 150.00 150
5 75.00
6 -450.00 -450
7 16.13 16.13
8 20.00
9 111.99 111.99
我想要的是一个新的数据列(或者真的用一个替换modifiedAmount列),其中包含""如果原始modifiedAmount是EITHER:
我很难弄清楚如何完成我预期会非常轻松的事情!
我可以得到这个:
ipdb> equal_test = df.modifiedAmount == df.line_amount
ipdb> blank_test = df.modifiedAmount == ""
但我不能这样做:
ipdb> blank_test and equal_test
*** ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
当我想应用标量结果时,我看到this选项,但我无法弄清楚如何将df放入lambda中:
ipdb> df.modifiedAmount.apply(lambda x: "" if x == df.line_amount else x)
*** NameError: global name 'df' is not defined
有什么想法吗?
期望的结果如下所示:
ipdb> df[["line_amount","modifiedAmount"]]
line_amount modifiedAmount
0 30.00
1 2.88
2 199.20
3 -105.00 -104.00
4 150.00
5 75.00
6 -450.00
7 16.13
8 20.00
9 111.99
(是的,理想情况下我想将任何剩余的值转换为浮点数到两位小数)
答案 0 :(得分:0)
您可以在整个数据框架上使用apply
列。
import pandas as pd
import numpy as np
创建一些虚拟数据并将其放入数据框中。我使用了np.nan而不是""。
df =pd.DataFrame( { 'lineAmount':[30.00,2.88,199.20,-105.00,150.00,75.00,-450.00,16.13,20.00,111.99], \
'modifiedAmount':[np.nan,2.88,199.20,-104.00,150.00,np.nan,-450.00,16.13,np.nan,111.99]})
然后,您可以使用axis=1
的{{1}}参数逐列使用整个数据框的lamda函数:
apply()
输出:
df['modifiedAmount'] =df.apply(lambda x: np.nan if x.modifiedAmount == x.lineAmount else x.modifiedAmount, axis =1)
答案 1 :(得分:0)
构建数据集。请注意,我已将所有数字输入为float(它们似乎是代码中的字符串)
import pandas as pd
s_dict = {'line_amount': [30, 2.88, 199.2, -105, 150, 75, -450, 16.13, 20, 111.99], 'modifiedAmount': [None,2.88,199.2,-104, 150, None, -450, 16.13, None, 111.99]}
df = pd.DataFrame.from_dict(s_dict)
print df
输出:
line_amount modifiedAmount
0 30.00 NaN
1 2.88 2.88
2 199.20 199.20
3 -105.00 -104.00
4 150.00 150.00
5 75.00 NaN
6 -450.00 -450.00
7 16.13 16.13
8 20.00 NaN
9 111.99 111.99
这一行需要一些解释。这里我们使用布尔掩码(df.modifiedAmount == df.line_amount
和pd.isnull(df.modifiedAmount)
),用|
(OR比较)分隔,开头的~
表示NOT。
df['new_mod'] = df.loc[~((df.modifiedAmount == df.line_amount) | (pd.isnull(df.modifiedAmount))), 'modifiedAmount']
print df
输出:
line_amount modifiedAmount new_mod
0 30.00 NaN NaN
1 2.88 2.88 NaN
2 199.20 199.20 NaN
3 -105.00 -104.00 -104
4 150.00 150.00 NaN
5 75.00 NaN NaN
6 -450.00 -450.00 NaN
7 16.13 16.13 NaN
8 20.00 NaN NaN
9 111.99 111.99 NaN