【问题标题】:Subset Pandas Data Frame Based on Some Row Value基于某些行值的子集 Pandas 数据框
【发布时间】:2016-10-30 21:57:46
【问题描述】:

我有一个 Pandas 数据框,其中包含“动态”列(这意味着在我从各种数据库中检索数据之前,我不知道列名是什么)。

数据框是一行,看起来像这样:

    Make   Date        Red     Blue     Green     Black     Yellow     Pink     Silver
89  BMW    2016-10-28  300.0   240.0    2.0       500.0     1.0        1.0      750.0

请注意,“89”是数据框中的特定行。

我有以下代码:

cars_bar_plot = df_cars.loc[(df_cars.Make == 'BMW') & (df_cars.Date == as_of_date)]

cars_bar_plot = cars_bar_plot.replace(0, value=np.nan)

cars_bar_plot = cars_bar_plot.dropna(axis=1, how='all')

这可以很好地帮助我创建上述单行数据框,但是每列中的一些值相对于其他值非常小(例如 1.0 和 2.0)他们正在扭曲我用 Matplotlib 创建的水平条形图。我想去掉小于某个最小阈值(例如 3.0)的数字。

知道我该怎么做吗?

谢谢!

更新 1

以下代码行有帮助,但并没有完全解决问题。

cars_bar_plot = cars_bar_plot.loc[:, (cars_bar_plot >= 3.0).any(axis=0)]

问题在于它消除了非预期的列。例如,引用原始数据框,是否可以修改此代码,使其仅删除值小于 3.0 “Black”列右侧的列(假设我们真的要在“Green”列中保留 2.0 的值吗)?

谢谢!

【问题讨论】:

  • 你想去掉列还是行?为什么不在单独的条形图中绘制每一列?
  • @amyrit - 我想去掉列(因为我只有一行开头)。例如,我在数据框中大约有 30 列。但是,有些列的值可以忽略不计,所以我想去掉这些值,并且只有超过某个阈值的值。

标签: python pandas subset


【解决方案1】:

假设您只想保留符合条件的行,您可以像这样过滤数据:

df[df.apply(lambda x: x > 0.5).min(axis=1)]

即只需查看与您的条件匹配的所有值,如果至少有一个不匹配,请尽快删除该行。

【讨论】:

  • 实际数据框有大约 30 列,其中一些列的值合法地小于我要设置的阈值(例如 3.0 或 2.0)。您的解决方案适用于 ALL 列还是仅适用于 某些 列?谢谢!
  • 我应用了这段代码:cars_bar_plot[cars_bar_plot.apply(lambda x: x > 1.0).min(axis=1)],发现整行都消失了。我在应用这个时犯了错误吗?
【解决方案2】:

这是我的问题的答案:

lower_threshold = 3.0
start_column = 5
df = df.loc[start_column:, (df >= lower_threshold).any(axis=0)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2013-02-20
    • 1970-01-01
    • 2018-04-28
    • 2021-09-02
    相关资源
    最近更新 更多