【问题标题】:Extracting data using pandas from a CSV file with a special condition使用 pandas 从具有特殊条件的 CSV 文件中提取数据
【发布时间】:2016-12-12 09:05:55
【问题描述】:

这是我拥有的数据示例

1, "dep, anxiety", 30 
2, "dep"         , 40
4, "stress"      , 30
7, "dep, fobia"  , 20

我想使用 pandas 过滤具有“dep”的行并将其保存在新的 cvs 文件中。输出应该是:

1, "dep, anxiety", 30
7, "dep, fobia"  , 20
2, "dep"         , 40

这是我的代码:

import pandas as pd
patients =  pd.read_csv("patients.csv", encoding='latin-1')

print(patients["dep" in patients["qual"]])

有以下错误

"return self._engine.get_loc(self._maybe_cast_indexer(key))"

而且我不知道如何将提取的数据导出到新的 csv 文件。

【问题讨论】:

  • 试试这个:patients[patients.qual.str.contains('dep')].to_csv('c:/temp/dep.csv', index=False)
  • 不是重复的。 OP 想知道如何在写入 CSV 之前提取包含 'dep' 的行。
  • @MaxU,这是一个答案;)。我认为较新的 Pandas 版本也支持像这样传递lambdas:df[lambda row: "dep" in row["qual"]],但目前无法尝试。
  • @filmor,是的,较新的 pandas 版本确实支持可调用索引,但我认为 patients.qual.str.contains('dep') 在更大的数据集上应该更快...

标签: csv pandas filtering


【解决方案1】:

你可以这样做:

In [213]: patients
Out[213]:
   ID           dis  rank
0   1  dep, anxiety    30
1   2           dep    40
2   4        stress    30
3   7    dep, fobia    20

In [214]: patients[(patients['dis'].str.contains('dep')) & (patients['rank'] == 30)]
Out[214]:
   ID           dis  rank
0   1  dep, anxiety    30

PS rank 是 pandas 方法,所以不能使用点列 (df.column_name) 访问器,因为 pandas 会认为你在调用 NDFrame.rank 方法:

演示:

这里我们调用NDFrame.rank方法的引用:

In [215]: patients.rank
Out[215]:
<bound method NDFrame.rank of    ID           dis  rank
0   1  dep, anxiety    30
1   2           dep    40
2   4        stress    30
3   7    dep, fobia    20>

这里我们叫rank专栏:

In [216]: patients['rank']
Out[216]:
0    30
1    40
2    30
3    20
Name: rank, dtype: int64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2021-04-04
    • 2020-07-13
    • 2018-12-10
    • 2017-07-24
    相关资源
    最近更新 更多