【问题标题】:Pandas: Drop() int64 based on value returns objectPandas:基于值的 Drop() int64 返回对象
【发布时间】:2016-10-13 00:27:59
【问题描述】:

我需要删除一列低于某个值的所有行。我使用了下面的命令,但这会将列作为对象返回。我需要保留它为int64:

df["customer_id"] = df.drop(df["customer_id"][df["customer_id"] < 9999999].index)
df = df.dropna()

之后我尝试将该字段重新转换为int64,但这会导致来自完全不同列的数据出现以下错误:

invalid literal for long() with base 10: '2014/03/09 11:12:27'

【问题讨论】:

  • df["cutomer_id"] = df.drop(df[df["cutomer_id"]
  • 这不会改变任何东西。谢谢。

标签: python pandas


【解决方案1】:

我认为你需要boolean indexingreset_index

import pandas as pd

df = pd.DataFrame({'a': ['s', 'd', 'f', 'g'],
                'customer_id':[99999990, 99999997, 1000, 8888]})
print (df) 
   a  customer_id
0  s     99999990
1  d     99999997
2  f         1000
3  g         8888

df1 = df[df["customer_id"] > 9999999].reset_index(drop=True)
print (df1)
   a  customer_id
0  s     99999990
1  d     99999997

drop 的解决方案,但速度较慢:

df2 = (df.drop(df.loc[df["customer_id"] < 9999999, 'customer_id'].index))
print (df2)
   a  customer_id
0  s     99999990
1  d     99999997

时间安排

In [12]: %timeit df[df["customer_id"] > 9999999].reset_index(drop=True)
1000 loops, best of 3: 676 µs per loop

In [13]: %timeit (df.drop(df.loc[df["customer_id"] < 9999999, 'customer_id'].index))
1000 loops, best of 3: 921 µs per loop

【讨论】:

  • 谢谢,成功了!是否可以在一个命令中在多个列上运行它?
  • 您需要比较9999999 的多个列吗?如果是,如果所有列中的行包含9999999 或至少一列包含9999999,则可以排除数据?
  • 例如9999999 代表一列,999 代表另一列?目前我需要定义一系列 DF 来捕捉变化。我确信有一种更聪明的方法可以做到这一点。
  • 抱歉,您需要为每一列设置一些不同的条件吗?例如对于列col1 的值高于999,对于另一个col2 高于77777 的每一列都这样吗?这对我来说不是很清楚。
【解决方案2】:

切片整个帧(必要时重新索引)有什么问题?

df = df[df["customer_id"] < 9999999]
df.index = range(0,len(df))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2022-11-18
    • 2017-10-06
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多