根据条件将数据框的值移动到列表中

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 中很少使用,因为 SeriesDataFramesPanels 使用数组。 所以我认为在同一个大括号中使用它们会花费更短的时间 我认为另一种解决方案使用纯boolean indexing 和我的答案是一起使用选择和布尔索引。所以我的解决方案更快,这意味着显然更好。所以我希望我的回答能被采纳。但如果喜欢另一种解决方案,那就可以了。

以上是关于根据条件将数据框的值移动到列表中的主要内容,如果未能解决你的问题,请参考以下文章

怎么解决 ? (将列表添加到列数据框pyspark)

将双引号添加到列中的值,只要值在数据框中有引号

PySpark Dataframe:将一个单词附加到列的每个值

移动到多选列表框的位置

SQL2000数据库中合并两行相同条件的值到列中怎么操作?

Pandas 将具有多个值的行数据合并到列的 Python 列表中