如何根据标量条件和列比较获取一列pandas数据?

时间:2015-02-05 05:36:15

标签: python pandas

这是一个起始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:

  • 已经"" OR
  • 等于line_amount

我很难弄清楚如何完成我预期会非常轻松的事情!

我可以得到这个:

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         

(是的,理想情况下我想将任何剩余的值转换为浮点数到两位小数)

2 个答案:

答案 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_amountpd.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