根据条件将数据框的值移动到列表中
Posted
技术标签:
【中文标题】根据条件将数据框的值移动到列表中【英文标题】:Move Values of a dataframe to a list based on a condition 【发布时间】:2017-04-11 22:05:26 【问题描述】:我正在尝试将数据从数据框中的单列移动到列表。
Account Name Renewal % Change
Client 1 0%
Client 2 0%
Client 3 2%
Client 4 0%
Client 5 1%
Client 6 1%
所以如果一个客户端有 0% 它应该被添加到列表 Cost0 并且它有 1% 它应该被添加到 Cost1。
我尝试使用 pd.series.tolist() 但它一直给我一个错误。
if brl['Renewal % Change'] == '0%':
a = pd.Series(brl['Account Name'])
a.tolist()
ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
请指教
【问题讨论】:
我现在无法检查它,但它不是您收到错误的if
声明吗?尝试这样的事情: list1 = brl.loc[brl['Renewal % Change'] == '0%', 'Account Name'].tolist() list2 = brl.loc[brl['Renewal % Change'] = = '1%', '账户名'].tolist()
【参考方案1】:
试试这个
Cost0 = brl[blr['Renewal % Change']=='0%']['Account Name'].tolist()
Cost1 = brl[blr['Renewal % Change']=='1%']['Account Name'].tolist()
更新
使用.loc
Cost0 = brl.loc[blr['Renewal % Change']=='0%','Account Name'].tolist()
Cost1 = brl.loc[blr['Renewal % Change']=='1%','Account Name'].tolist()
【讨论】:
谢谢,这是一个简单的解决方案,可以按我的意愿工作【参考方案2】:您可以通过loc
选择列来使用稍微改变的boolean indexing
:
mask = brl['Renewal % Change'] == '0%'
print (mask)
0 True
1 True
2 False
3 True
4 False
5 False
Name: Renewal % Change, dtype: bool
print (brl.loc[mask, 'Account Name'].tolist())
['Client 1', 'Client 2', 'Client 4']
大家一起:
Cost0 = brl.loc[brl['Renewal % Change'] == '0%', 'Account Name'].tolist()
print (Cost0)
['Client 1', 'Client 2', 'Client 4']
Cost1 = brl.loc[brl['Renewal % Change'] == '1%', 'Account Name'].tolist()
print (Cost1)
['Client 5', 'Client 6']
你得到错误,因为比较返回布尔值Series
- 数组,而不是标量值,请参阅docs:
print (brl['Renewal % Change'] == '0%')
0 True
1 True
2 False
3 True
4 False
5 False
Name: Renewal % Change, dtype: bool
比较解决方案 - loc
更快:
In [137]: %timeit brl.loc[brl['Renewal % Change'] == '0%', 'Account Name'].tolist()
1000 loops, best of 3: 536 µs per loop
In [138]: %timeit brl[brl['Renewal % Change']=='0%']['Account Name'].tolist()
1000 loops, best of 3: 657 µs per loop
【讨论】:
感谢第二个解决方案运行良好,并给出了错误的原因所以这意味着 Pandas 数据帧上的 IF 条件无法正常工作 没错,如果在 pandas 中很少使用,因为Series
、DataFrames
和 Panels
使用数组。
所以我认为在同一个大括号中使用它们会花费更短的时间
我认为另一种解决方案使用纯boolean indexing
和我的答案是一起使用选择和布尔索引。所以我的解决方案更快,这意味着显然更好。所以我希望我的回答能被采纳。但如果喜欢另一种解决方案,那就可以了。以上是关于根据条件将数据框的值移动到列表中的主要内容,如果未能解决你的问题,请参考以下文章